powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо из хранимой процедуры вернуть набор данных
8 сообщений из 8, страница 1 из 1
Необходимо из хранимой процедуры вернуть набор данных
    #32063252
Доброго времени суток всем.

Возникла такая проблема - необходимо из хранимой процедуры вернуть набор данных (аналог в MSSQL -

Create procedure .....

select * from Table1
end;
) и чтобы с этим набором данных можно было работать в Delphi 5.

как это можно сделать?

пробовал возвращать таблицу -

CREATE OR REPLACE TYPE TEST_REC AS OBJECT (
"TEST_REC_ID" "INTEGER", "TEST_REC_NAME" VARCHAR2(255))

CREATE OR REPLACE TYPE TEST_TABLE AS
TABLE OF TEST_REC

create procedure TestProc(Test out TEST_TABLE) is ...

Delphi в TStoredProc создает параметр c ParamType=ftADT
и при выполнении процедуры выскакивает Access Violation
может кто-нибудь подскажет что делать?

Заранее спасибо.
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32063268
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не совсем понятно, дл чего нужно получить данные именно из процедуры?
Не надо пытаться применять методы, которые применялись в MSSQL - в Oracle. В Oracle, в процедуре нельзя использовать стандартный SQL запрос непосредственно в теле процедуры, как это можно в MSSQL.
Тот вариант SQL запроса, который можно использовать
используется только с фразой INTO:
SELECT <list field> INTO <list variable> FROM <table>, которая подразумевает помещение данных в переменную(нные) памяти, в связи с чем, такой запрос не должен возвращать более 1-ой строки, иначе будет исключение.
Обычный же запрос может быть произведён только через курсор: сначала он должен быть описан:CURSOR c_ind IS SELECT ....., затем считан разными способами.
Что-бы вернуть курсор из процедуры, используется тип REF_CURSOR(сам не использую, подробнее сказать не могу).
Есть еще вариант через создание обьекта(рабочий пример, сам писал - сам проверял):

CREATE TYPE pages_object AS OBJECT
(
page_serial NUMBER(16),
name VARCHAR2(15),
page_file VARCHAR2(255),
sequritylevel NUMBER(3),
uses NUMBER(16)
);
/

CREATE TYPE pages_table AS TABLE OF pages_object;
/

CREATE OR REPLACE FUNCTION GetPagesCursor RETURN pages_table IS

CURSOR c_pages IS
SELECT page_serial, UPPER(name), pagefile, securitylevel, uses FROM pages;

v_pages pages%ROWTYPE;
t_pages pages_table := pages_table();
n INTEGER:=0;
BEGIN
FOR v_pages IN c_pages LOOP
n:=n+1;
t_pages.EXTEND;
t_pages(n):=v_pages;
END LOOP;
RETURN t_pages;
END GetPagesCursor;
/

-- Использование
-- Здесь запрос данные получает непосредственно из функции:
SELECT
page_serial,
name
FROM
TABLE( CAST(GetPagesCursor() AS pages_table));

А вообще почему не хочешь просто получать данные из запроса, без всяких процедур? С использованием TQuery и тому подобных?
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32063324
_kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32063982
Возвращать набор необходимо было, чтобы не менять структуру программы (я перевожу проект с MSSQL на ORACLE). В MSSQL процедура в соответствии с некоторыми правилами подготавливает набор данных и заносит его во временную таблицу, после чего делает из нее SELECT, что и является результатом процедуры.
Покопавшись, я научился возвращать из спроцедуры курсор и работать с ним в Delphi, но, в итоге, это не понадобилось - Процедура годовит набор данных и заносит его во временную таблицу, а потом TQuery просто делает из нее SELECT. Причем данные во временной таблице специфичны либо для сессии, либо для транзакции (CREATE GLOBAL TEMPORARY TABLE ...).
Спасибо за ответ.
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32063993
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если временная таблица нужна только для того, что-бы получить преобразованные данные, в принципе можно и через
SELECT
page_serial,
name
FROM
TABLE( CAST(GetPagesCursor() AS pages_table));

В процедуре GetPagesCursor можно любое преобразование сделать.
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32130057
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вляется ли правильной стратегия создания временных таблиц в описанном выше случае. Насrолько велики накладные расходы на создание, не приводит ли это к блокировкам? Сам перехожу с MS SQL и столкнулся с той же проблемой. Oracle 8.1.7... Хочется услышать мнение Гуру - как правильно перестроить логику хр. пр. MS SQL, которые возвращают результирующий набор? Через ref cursor, создавать вр. таблицы, использовать функции ? Как правильно?
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32130140
М-да.. с ответами негусто ((
...
Рейтинг: 0 / 0
Необходимо из хранимой процедуры вернуть набор данных
    #32130145
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема возврата набора значений из функции неоднократно обсуждалась в форуме, ищите.
Я могу просто добавить, сделать можно ВСЕ, причем пути решения могут быть различными в зависимости от задачи и версии Oracle.
еще ссылка (помимо этого форума)
http://www.ln.com.ua/~openxs/projects/oracle/ora011.html
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необходимо из хранимой процедуры вернуть набор данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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