Почти перевел хранимку с MSSQL на Oracle.
Но... что требуется чтобы вернуть набор данных из хранимки?
А то требует вставить набор куда-то (into).
Может курсор какой-то надо объявлять, в него вставлять и его уже возвращать?
Но ведь не должно же быть все так сложно...
Для примера:
create procedure p1
as
begin
select 1 from dual; -- ругается и требует слова into
end;
Что не хватает?
Re: Oracle. Хранимая процедура возвращающая набор данных.
Здравствуйте, xtony, Вы писали:
X>Почти перевел хранимку с MSSQL на Oracle. X>Но... что требуется чтобы вернуть набор данных из хранимки? X>А то требует вставить набор куда-то (into). X>Может курсор какой-то надо объявлять, в него вставлять и его уже возвращать? X>Но ведь не должно же быть все так сложно...
Как пример можно попробовать такой вариант:
create or replace type t_row is record ( id number, name varchar2(100) );
create or replace type t_set is table of t_row;
а теперь сама функция
create or replace function func1 return t_set
is
l_ret_val t_set := t_set();
begin
-- вариант первый
-- данные получаем запросом
select id, name
bulk collect into t_set
from table1;
-- вариант второй
-- сами их создаем
loop
l_ret_val.extend;
l_ret_val(l_ret_val.last) := v_row(/*тут id*/, /*тут name*/);
end loop;
return l_ret_val;
end;
данные получаем так
select * from table (func1())
или если более точно то так
select * from table (cast(func1() as t_set))
Но это только если я правилно понял ваш вопрос
X>Для примера:
X>create procedure p1 X> as X>begin X> select 1 from dual; -- ругается и требует слова into X>end;
тут действительно нужно into поскольку куда Oracle-у девать "1" он не знает
... << RSDN@Home 1.1.4 beta 2 >>
Re: Oracle. Хранимая процедура возвращающая набор данных.
Здравствуйте, xtony, Вы писали:
X>Почти перевел хранимку с MSSQL на Oracle. X>Но... что требуется чтобы вернуть набор данных из хранимки? X>А то требует вставить набор куда-то (into). X>Может курсор какой-то надо объявлять, в него вставлять и его уже возвращать? X>Но ведь не должно же быть все так сложно...
X>Для примера:
X>create procedure p1 X> as X>begin X> select 1 from dual; -- ругается и требует слова into X>end;
X>Что не хватает?
Тут не хватает понимания синтаксиса Ты выбрал данные "вникуда", сервер обиделся... Правильный вариант:
select 1 into n from dual
Но это, похоже, не то что тебе надо.
Тебе, скорее всего, нужен REF CURSOR — почитай в хелпе про его синтаксис. Его стопудово можно возвращать из процедур (точно синтаксис я уж сам не помню).
Re[2]: Oracle. Хранимая процедура возвращающая набор данных.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, xtony, Вы писали:
W>Набор данный нужно вернуть куда: клиенту? другой процедуре? Какой клиент (интерфейс)?
create procedure zzz
(mycurs out sys_refcursor) is
begin
open mycurs for select 1 from dual;
end ;
Это работает. Где-то в документации по Ораклу видел как через ADO работать с этим дальше. Буду рыть.
Клиента буду делать на .NET или Delphi. Пока не решился на что лучше.
Re[3]: Oracle. Хранимая процедура возвращающая набор данных.
Здравствуйте, xtony, Вы писали:
X>create procedure zzz X> (mycurs out sys_refcursor) is X>Это работает. Где-то в документации по Ораклу видел как через ADO работать с этим дальше. Буду рыть.
Да, только OLEDB провайдер должен быть последней версии и от Oracle а не от MS.
Читай Oracle Provider for OLE DB Developer's Guide