Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.08.11;
Скачать: CL | DM;

Вниз

PL/SQL - хочу странного (а может и нет)   Найти похожие ветки 

 
Dennis I. Komarov ©   (2012-11-13 22:20) [0]

оракуль может подобное?
транслит:
function (a1, a2, ..., am, var b1, b2, ..., bn): TDataSet;

т.е.
FUNCTION...
in
in
out
out
RETURN

на выходе рекордсет (CURSOR наверное)

если да, то пример плз


 
Медвежонок Пятачок ©   (2012-11-13 22:47) [1]

может конечно.
только зачем именно функция, если речь про PL/SQL?


 
Dennis I. Komarov ©   (2012-11-14 07:42) [2]

Переведи...


 
AV ©   (2012-11-14 08:36) [3]

как вариант,

CREATE OR REPLACE PACKAGE "ATS_ORDER"
is
 TYPE TCursor IS REF CURSOR;
 procedure CloseOrder (Order_ID in number, Cur in out TCursor);
--
 procedure CloseOrder (Order_ID in number, Cur in out TCursor)
 is
   vRes Varchar2(500);
 begin
   vRes := main.Ord_val.Close_Order(Order_ID, sysdate);
   if vRes = "OK"
     then
       OPEN Cur for
       SELECT "OK" RSLT, vRes TXT
       FROM dual;
     else
       OPEN Cur for
       SELECT "NO" RSLT, vRes TXT
       FROM dual;
   end if;
 end;
----------=====
opMainProc.StoredProcName := "applic.ats_order.CloseOrder";

     opMainProc.Close;
     opMainProc.ParamByName("ORDER_ID").Value := nIdOrder;
     opMainProc.Open;
     Result := (opMainProc.FieldByName("RSLT").AsString = "OK");
     sReslt := opMainProc.FieldByName("TXT").AsString;

Работает с год уже, в этой части не глючит


 
Медвежонок Пятачок ©   (2012-11-14 08:45) [4]

Переведи...

opMainProc.StoredProcName := "applic.ats_order.CloseOrder";


Перевожу.
Приведенный выше пример не имеет отношения к PL/SQL. Он имеет отношение к SQL.


 
Dennis I. Komarov ©   (2012-11-22 19:14) [5]


> Приведенный выше пример не имеет отношения к PL/SQL. Он
> имеет отношение к SQL.

Приведенный пример, ни что иное как транслит, для передачи смысла и не более (если речь о моем)


 
Медвежонок Пятачок ©   (2012-11-22 19:18) [6]

Зачем тебе особая функция для передачи курсора куда бы то ни было внутри PL/SQL?

Курсор там  - такой же точно тип данных, как любой другой.
Передавай его в любую функцию как параметр.

Или имелось ввиду не PL/SQL, а просто SQL?


 
Dennis I. Komarov ©   (2012-11-22 19:23) [7]

Вопрос такой:
есть в оракуле хранимка, пусть 2 входящих и 3 исходящих параметра

!!! Как в DataSet (или DataCommand) задать команду, что бы получить out-параметры. Интересует синтаксис, я оракуль не очень знаю.
в нете нашел синтаксис:
DECLARE @qqq
EXEC proc 1,2, @qqq
SELECT @qqq
не работает.


 
Dennis I. Komarov ©   (2012-11-22 19:36) [8]


> Зачем тебе особая функция для передачи курсора куда бы то
> ни было внутри PL/SQL?
>
> Курсор там  - такой же точно тип данных, как любой другой.
>
> Передавай его в любую функцию как параметр.
>
> Или имелось ввиду не PL/SQL, а просто SQL?

Первоначальная задача - вернуть несколько параметров, один из которых DataSet (в конечном счете в дельфу ес-но)
(Сейчас не актуально, но познавательно)


 
Медвежонок Пятачок ©   (2012-11-22 19:56) [9]

(в конечном счете в дельфу ес-но)

Тогда это далеко не PL/SQL.

А что за странные собачки в [7]?
/*Это же MSSQL*/


 
Dennis I. Komarov ©   (2012-11-22 20:11) [10]


> А что за странные собачки в [7]?

Х.З. :) Я не помню откуда (сегодня гуглил по просторам)
В оракуле есть проца, я с ней из дельфы работать буду...


 
Игорь Шевченко ©   (2012-11-22 20:51) [11]

Dennis I. Komarov ©   (22.11.12 20:11) [10]

В древнем Китае желающим странного отрубали голову.


 
Игорь Шевченко ©   (2012-11-22 20:55) [12]


>  я оракуль не очень знаю.


http://docs.oracle.com/cd/B19306_01/server.102/b14220/toc.htm


 
Dennis I. Komarov ©   (2012-11-22 21:05) [13]


> В древнем Китае желающим странного отрубали голову.

У них и тогда перенаселение уже было...

> http://docs.oracle.com/cd/B19306_01/server.102/b14220/toc.
> htm

Юзать TStoredProc местный феншуй не позволяет...


 
Игорь Шевченко ©   (2012-11-22 21:43) [14]


> Юзать TStoredProc местный феншуй не позволяет...


Я не понимаю, чего ты хочешь. Расскажи два раза и медленно.


> оракуль может подобное?
> транслит:
> function (a1, a2, ..., am, var b1, b2, ..., bn): TDataSet;
>
>
> т.е.
> FUNCTION...
> in
> in
> out
> out
> RETURN
> на выходе рекордсет (CURSOR наверное)
>
> если да, то пример плз


Потому что из этих слов, кроме как отрубить голову, я выхода не вижу :)


 
Dennis I. Komarov ©   (2012-11-22 22:04) [15]


> Я не понимаю, чего ты хочешь. Расскажи два раза и медленно.

Есть в оракуле хранимка с in и out параметрами. Как с через ADODateSet(DataCommand) получить значение out-параметров?
{к [0] это не относится}


 
Dennis I. Komarov ©   (2012-11-22 22:07) [16]


> Потому что из этих слов, кроме как отрубить голову, я выхода
> не вижу :)

Так за что? Надо было вернуть помимо рекордсета еще пару значений, чтобы не делать запрос дважды. Просто спросил, можно сие, али нет. Так ведь сразу... :)


 
Медвежонок Пятачок ©   (2012-11-22 22:11) [17]

adocommand, правильно настроенные параметры с типом in out b и все должно работать


 
Dennis I. Komarov ©   (2012-11-22 22:30) [18]

Синтаксис какой?


 
Игорь Шевченко ©   (2012-11-22 23:20) [19]

CREATE OR REPLACE FUNCTION foobar (
 a_foo IN NUMBER,
 a_bar IN VARCHAR2,
 a_foo_out OUT NUMBER,
 a_bar_out OUT VARCHAR2
) RETURN NUMBER
IS
BEGIN
 a_foo_out := NVL(a_foo,1) * 2;
 a_bar_out := NVL(a_bar, "BAR")||" "||"BAR";
 RETURN 100;
END;
/


procedure TForm1.Button1Click(Sender: TObject);
begin
 db.Open;
 cmd.Prepared := true;
 cmd.Parameters.ParamValues["a_foo"] := 1;
 cmd.Parameters.ParamValues["a_bar"] := "FOOBAR";
 cmd.Execute;
 ShowMessageFmt("%s %s %s",
   [VarToStr(cmd.Parameters.ParamValues["result"]),
    VarToStr(cmd.Parameters.ParamValues["a_foo_out"]),
    VarToStr(cmd.Parameters.ParamValues["a_bar_out"])]);
end;


 object cmd: TADOCommand
   CommandText =
     "begin  :result ::= foobar(:a_foo, :a_bar, :a_foo_out, :a_bar_out" +
     "); end;"
   Connection = DB
   Parameters = <
     item
       Name = "result"
       DataType = ftInteger
       Direction = pdReturnValue
       Size = -1
       Value = Null
     end
     item
       Name = "a_foo"
       DataType = ftInteger
       Size = -1
       Value = Null
     end
     item
       Name = "a_bar"
       DataType = ftString
       Size = 4000
       Value = Null
     end
     item
       Name = "a_foo_out"
       DataType = ftInteger
       Direction = pdOutput
       Size = -1
       Value = Null
     end
     item
       Name = "a_bar_out"
       DataType = ftString
       Direction = pdOutput
       Size = 4000
       Value = Null
     end>
   Left = 96
   Top = 20
 end


 
Игорь Шевченко ©   (2012-11-22 23:24) [20]

Какая же дрянь это ваше ADO


 
Германн ©   (2012-11-23 01:57) [21]


> Игорь Шевченко ©   (22.11.12 23:24) [20]
>
> Какая же дрянь это ваше ADO
>

Т.е. BDE всё-таки лучше ADO?


 
Dennis I. Komarov ©   (2012-11-23 06:40) [22]


> cmd.Prepared := true;
>  cmd.Parameters.ParamValues["a_foo"] := 1;
>  cmd.Parameters.ParamValues["a_bar"] := "FOOBAR";
>  cmd.Execute;
>  ShowMessageFmt("%s %s %s",
>    [VarToStr(cmd.Parameters.ParamValues["result"]),
>     VarToStr(cmd.Parameters.ParamValues["a_foo_out"]),
>     VarToStr(cmd.Parameters.ParamValues["a_bar_out"])]);
>
> end;
>
>  object cmd: TADOCommand
>    CommandText =
>      "begin  :result ::= foobar(:a_foo, :a_bar, :a_foo_out,
>  :a_bar_out" +
>      "); end;"

Вон оно как...
Я ожидал что-то вроде select f(...) from dual или подобных танцев...


> Какая же дрянь это ваше ADO

А аргументы? Какая разница как мы доставим команду до оракуля?


 
Игорь Шевченко ©   (2012-11-23 09:54) [23]


> А аргументы?


Кривое не может сделаться прямым (Еккл. 1, 15)


 
Dennis I. Komarov ©   (2012-11-23 19:05) [24]

Спасибо!

Еще вопрос:
Как приводите TDateTime к оракловой DATE? Что-то мне не ндра каждый раз делать строку и конвертировать to_date.
to_date(..., "J") ближе, но тоже не красиво...
Может есть другие встроенные функции?


 
Игорь Шевченко ©   (2012-11-23 20:39) [25]


> Может есть другие встроенные функции?


ANSI стандарт даты в виде литерала: DATE "YYYY-MM-DD"


 
Dennis I. Komarov ©   (2012-11-23 21:20) [26]


> ANSI стандарт даты в виде литерала: DATE "YYYY-MM-DD"

Да, знаю... но ведь тоже стринг...
(и если не изменили ручками, а ведь могут)


 
Dennis I. Komarov ©   (2012-11-23 21:26) [27]

Пардон, а вот:

Тип данных DATE

Тип данных DATE хранит значения в виде точек времени (т.е. дату и время). Тип данных DATE запоминает год (включая век), месяц, день, часы, минуты и секунды. ORACLE может хранить даты в диапазоне от 1 января 4712 года до н.э. до 31 декабря 4712 года нашей эры. Если в маске формата не указано BC (до н.э.), предполагается по умолчанию наша эра (AD).

ORACLE использует для хранения дат собственный внутренний формат. Данные дат хранятся в фиксированных полях длиной семь байт, соответствующих веку, году, месяцу, дню, часу, минуте и секунде.

Стандартный формат даты ORACLE для ввода и вывода имеет вид DD-MON-YY, например:

"13-NOV-92"


 
Игорь Шевченко ©   (2012-11-23 22:14) [28]


> Стандартный формат даты ORACLE для ввода и вывода имеет
> вид DD-MON-YY, например:


Этот формат зависит от настроек сеанса, сервера, базы данных.

"The default date format for an Oracle date value is derived from the NLS_DATE_FORMAT and NLS_DATE_LANGUAGE initialization parameters"

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1006006

Любите доку, источник знаний


 
Dennis I. Komarov ©   (2012-12-04 21:37) [29]


TYPE TCursor IS REF CURSOR;

CREATE OR REPLACE FUNCTION bla-bla (
a_1 IN NUMBER,
a_2 IN VARCHAR,
a_3 OUT NUMBER,
a_4 OUT NUMBER
) RETURN TCursor


Как получить из нее набор данных (TDataSet) в Delphi?


 
Игорь Шевченко ©   (2012-12-04 21:56) [30]

http://www.google.ru/search?q=select+from+ref+cursor+delphi
http://www.delphimaster.net/view/3-86632


 
Dennis I. Komarov ©   (2012-12-04 22:17) [31]

select * from table (bla-bla(...));чет не работает (уже находил)
как ее в DataSet загнать, что-то так и не сообразил
еще нашел объявить объект ROWTYPE и далее TABLE of но в oracle не очень хотелось лезть.
Есть процедура, и она возвращает и out-параметры и TCursor (набор данных), а вот как этот TCursor отправить в DataSet не трогая оракуль?


 
Игорь Шевченко ©   (2012-12-04 22:29) [32]


> чет не работает


Больно слышать.

А как ты себе представляешь такую процедуру и работу с ней ?


 
Dennis I. Komarov ©   (2012-12-04 23:08) [33]


> А как ты себе представляешь такую процедуру и работу с ней
> ?

TAdoDataSet.Create
Connection:=
Parameters.Create(
...
Parameters.Create(
CommandText:="select
// CommandText:=bla-bla DataSet не возвращает
Active := true

или что-то в этом духе


 
Игорь Шевченко ©   (2012-12-04 23:20) [34]

Я про другое - нафиг такая фукнция нужна ?

зачем тебе одновременно и входные параметры и выходные параметры и набор данных ?


 
Dennis I. Komarov ©   (2012-12-05 00:16) [35]


> зачем тебе одновременно и входные параметры и выходные параметры
> и набор данных ?

чтобы не делать несколько запросов к БД:
функция собирает статистику за определенное время:
ID,DateIn, DateOut - IN
Значение на начало, на конец периода - OUT
DataSet - операции


 
Игорь Шевченко ©   (2012-12-05 11:53) [36]


> чтобы не делать несколько запросов к БД:


штрафуют ? в оракле подобный подход массово не применяется


 
Dennis I. Komarov ©   (2012-12-05 12:26) [37]

Ладно, сменим подход... (Кстати почему?)

Тогда предположим, что out-параметров нет. Как функция должна выглядеть ( и как результат поймать в dataset)?
Select через ado не проходит, слишком сложный видимо, поэтому и нужна функция


 
Игорь Шевченко ©   (2012-12-05 14:14) [38]

Dennis I. Komarov ©   (05.12.12 12:26) [37]

Отдельно функция, отдельно запрос на dataset


 
Dennis I. Komarov ©   (2012-12-05 16:02) [39]

Т.е. результат селекта в return положить низя (в том же виде)?
Ну не возвращает результат такого селекта. А вот в SQL Novigator дает результат...


 
Кука съела ник   (2012-12-05 16:52) [40]

Dennis I. Komarov ©   (05.12.12 16:02) [39]

Все можно сделать, но в древнем Китае желающим странного отрубали голову.



Страницы: 1 2 вся ветка

Текущий архив: 2013.08.11;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.008 c
3-1291757158
Цукор5
2010-12-08 00:25
2013.08.11
запрос


4-1266085257
Владимир З.
2010-02-13 21:20
2013.08.11
Мышиный хук в "особом" приложении не работает???


2-1355079904
KilkennyCat
2012-12-09 23:05
2013.08.11
Предел ширины контрола


15-1362861003
Юрий
2013-03-10 00:30
2013.08.11
С днем рождения ! 10 марта 2013 воскресенье


15-1357748694
ТимоховД
2013-01-09 20:24
2013.08.11
Delphi XE3