|
Возвращения Result Set из Oracle.
|
|||
---|---|---|---|
#18+
Вопрос: могу ли я вернуть из Oracle result set из хранимой процедуры подобно Sybase, MS SQL. Или существуют ли методы возврата result set за исключением использования REF CURSOR. Например: Я хочу написать процедуру: CREATE OR REPLACE PROCEDURE DCS_GET (P_DCS_ID IN INTEGER ) AS BEGIN select * from DCS END; на что получаю: PLS-00428: an INTO clause is expected in this SELECT statement. P.S. Заранее большое спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2002, 13:10 |
|
Возвращения Result Set из Oracle.
|
|||
---|---|---|---|
#18+
Блин, даже слов нет, как выразить свое возмущение, типа чувак такой крутой - "подобно Sybase, MS SQL". Читай документацию, блин. create or replace function DCS_GET(P_DCS_ID in integer) is type DATASET is ref cursor; vc_dcs is DATASET; begin open vc_dcs for select * from DCS where DCS_ID=P_DCS_ID; return vc_dcs; end; ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2002, 13:16 |
|
Возвращения Result Set из Oracle.
|
|||
---|---|---|---|
#18+
Тьфу блин, до того возмутился, что сам ошибся, а поравить соощение больше не дают. Вот тебе слегка измененный пример из PL/SQL User Guide and Reference: CREATE PACKAGE dcs_data AS ... TYPE dcs_dataset IS REF CURSOR RETURN dcs%ROWTYPE; PROCEDURE open_dcs_cv (p_dcs_id in integer, dcs_cv IN OUT dcs_dataset); END dcs_data; CREATE PACKAGE BODY dcs_data AS ... PROCEDURE open_dcs_cv (p_dcs_id in integer, dcs_cv IN OUT dcs_dataset) IS BEGIN OPEN dcs_cv FOR SELECT * FROM dcs WHERE dcs_id=p_dcs_id; END open_dcs_cv; END dcs_data; Вот и все... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2002, 13:58 |
|
Возвращения Result Set из Oracle.
|
|||
---|---|---|---|
#18+
Эй, _VVP_! Не надо сердиться! RTFM - это классно, но иногда слово живого человека тоже необходимо! Кстати, сам-то внимательнее почитай задание! Там написано: "...за исключением использования REF CURSOR." Так что ты тоже не без недостатков! Как и я, впрочем ) А теперь по делу: PLS-00428 возникает от того, что процедуры и модули в PL/SQL могут возвращать только одну строку из запроса. Но и этот однострочный результат необходимо вывести в переменную, а затем из переменной взять данные и использовать. Но это будет ПОСТРОЧНЫЙ result set: CREATE OR REPLACE PROCEDURE DCS_GET (P_DCS_ID IN INTEGER ) AS c1 cursor is select * from DCS where DCS.ID = P_DCS_ID; v1 c1%rowtype; begin open c1; loop fetch c1 into v1; exit when c1%notfound; -- Здесь делаешь с данными что тебе надо end loop; close c1; end; Более серьезно использование таблиц PL/SQL: --Для уникальности записей создадим последовательность create sequence seq_v_DCS start with 1 increment by 1; CREATE OR REPLACE PROCEDURE DCS_GET (P_DCS_ID IN INTEGER ) AS -- Определим тип таблицы TYPE t_DCS is table of DCS%rowtype index by binary_integer; --Каждый элемент v_DCS является записью v_DCS t_DCS; -- Теперь переменная V_DCS получила место в памяти BEGIN select * into v_DCS(seq_v_DCS.nextval) from DSC where DCS.ID = P_DCS_ID; --делаем с данными что угодно, доступаясь к таблице по формату "таблица(индекс).поле" END; А потом обращайся к этой таблице. Дальше уже - читай мануал. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2002, 10:41 |
|
Возвращения Result Set из Oracle.
|
|||
---|---|---|---|
#18+
Вот только памяти эта штука (PL/SQL tables) жрёт... На практике проверено и получено следующее: цикл (примерно выглядящий как...) for r in cursor_A do something_nasty(r) end не жрёт серверную память, зато может скончаться с snapshot too old. Зато цикл for r in cursor_A do table_rows(i):=r; end for s in table_rows do something_nasty(s) end почти никогда не умрёт с snapshot too old, зато <B>серверной</B> памяти съест немеряно (ну сколько там эта выборка займёт в памяти плюс накладные расходы)... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2002, 00:57 |
|
|
start [/forum/topic.php?fid=52&msg=32032404&tid=1993321]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 134ms |
0 / 0 |