Форум: "Начинающим";
Текущий архив: 2013.08.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.002 c