powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возвращения Result Set из Oracle.
5 сообщений из 5, страница 1 из 1
Возвращения Result Set из Oracle.
    #32030528
ARufanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос: могу ли я вернуть из 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.
Заранее большое спасибо за помощь.
...
Рейтинг: 0 / 0
Возвращения Result Set из Oracle.
    #32030577
_VVP_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, даже слов нет, как выразить свое возмущение, типа чувак такой крутой - "подобно 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;
...
Рейтинг: 0 / 0
Возвращения Result Set из Oracle.
    #32030579
_VVP_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу блин, до того возмутился, что сам ошибся, а поравить соощение больше не дают.

Вот тебе слегка измененный пример из 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;

Вот и все...
...
Рейтинг: 0 / 0
Возвращения Result Set из Oracle.
    #32031524
Linker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эй, _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;

А потом обращайся к этой таблице. Дальше уже - читай мануал.
...
Рейтинг: 0 / 0
Возвращения Result Set из Oracle.
    #32032404
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот только памяти эта штука (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> памяти съест немеряно (ну сколько там эта выборка займёт в памяти плюс накладные расходы)...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возвращения Result Set из Oracle.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]