Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

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


 
MsGuns ©   (2012-12-06 19:13) [41]

>Dennis I. Komarov ©   (05.12.12 12:26) [37]
>и как результат поймать в dataset?

Сказано же было - на сервере - ХП, на клиенте TADODataSet =  TADOCommand.Execute + F1


 
Dennis I. Komarov ©   (2012-12-07 23:06) [42]


> Сказано же было - на сервере - ХП, на клиенте TADODataSet
> =  TADOCommand.Execute + F1

Так вопрос, что в retern класть оракловый...

т.е. что возвращает select, и как заставить функцию возвращать это (с т.з. оракуля)


 
Медвежонок Пятачок ©   (2012-12-07 23:38) [43]

положи туда адошный датапакет в xml



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

Форум: "Начинающим";
Текущий архив: 2013.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.005 c
2-1355210568
Scott Storch
2012-12-11 11:22
2013.08.11
Конвертировать форму из бинарного вида в текстовый


2-1354816115
TCount
2012-12-06 21:48
2013.08.11
Неувязочка с PopupMenu...


15-1363109461
Jimmy
2013-03-12 21:31
2013.08.11
Графический математический редактор


2-1352830854
Dennis I. Komarov
2012-11-13 22:20
2013.08.11
PL/SQL - хочу странного (а может и нет)


4-1266295074
Tonick2001
2010-02-16 07:37
2013.08.11
Нужна помощь с модулем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский