Oracle. Хранимая процедура возвращающая набор данных.
От: xtony  
Дата: 28.07.04 20:51
Оценка:
Почти перевел хранимку с MSSQL на Oracle.
Но... что требуется чтобы вернуть набор данных из хранимки?
А то требует вставить набор куда-то (into).
Может курсор какой-то надо объявлять, в него вставлять и его уже возвращать?
Но ведь не должно же быть все так сложно...

Для примера:

create procedure p1
as
begin
select 1 from dual; -- ругается и требует слова into
end;

Что не хватает?
Re: Oracle. Хранимая процедура возвращающая набор данных.
От: bloom  
Дата: 29.07.04 06:43
Оценка:
Здравствуйте, 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. Хранимая процедура возвращающая набор данных.
От: wildwind Россия  
Дата: 29.07.04 07:18
Оценка:
Здравствуйте, xtony, Вы писали:

Набор данный нужно вернуть куда: клиенту? другой процедуре? Какой клиент (интерфейс)?
Re: Oracle. Хранимая процедура возвращающая набор данных.
От: Аноним  
Дата: 29.07.04 08:56
Оценка:
если на клиент то есть sys_refcursor

CREATE OR REPLACE PROCEDURE ... (mycurs out sys_refcursor) is
begin
open mycurs for select ...
end ;
Re: Oracle. Хранимая процедура возвращающая набор данных.
От: Степанов Андрей  
Дата: 29.07.04 10:58
Оценка:
Здравствуйте, 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. Хранимая процедура возвращающая набор данных.
От: xtony  
Дата: 30.07.04 12:18
Оценка:
Здравствуйте, 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. Хранимая процедура возвращающая набор данных.
От: wildwind Россия  
Дата: 30.07.04 13:51
Оценка:
Здравствуйте, xtony, Вы писали:

X>create procedure zzz

X> (mycurs out sys_refcursor) is
X>Это работает. Где-то в документации по Ораклу видел как через ADO работать с этим дальше. Буду рыть.

Да, только OLEDB провайдер должен быть последней версии и от Oracle а не от MS.
Читай Oracle Provider for OLE DB Developer's Guide
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.