|
|
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток всем. Возникла такая проблема - необходимо из хранимой процедуры вернуть набор данных (аналог в 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 может кто-нибудь подскажет что делать? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2002, 17:00 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
Мне не совсем понятно, дл чего нужно получить данные именно из процедуры? Не надо пытаться применять методы, которые применялись в 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 и тому подобных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2002, 17:25 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2002, 18:32 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
Возвращать набор необходимо было, чтобы не менять структуру программы (я перевожу проект с MSSQL на ORACLE). В MSSQL процедура в соответствии с некоторыми правилами подготавливает набор данных и заносит его во временную таблицу, после чего делает из нее SELECT, что и является результатом процедуры. Покопавшись, я научился возвращать из спроцедуры курсор и работать с ним в Delphi, но, в итоге, это не понадобилось - Процедура годовит набор данных и заносит его во временную таблицу, а потом TQuery просто делает из нее SELECT. Причем данные во временной таблице специфичны либо для сессии, либо для транзакции (CREATE GLOBAL TEMPORARY TABLE ...). Спасибо за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2002, 13:12 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
Если временная таблица нужна только для того, что-бы получить преобразованные данные, в принципе можно и через SELECT page_serial, name FROM TABLE( CAST(GetPagesCursor() AS pages_table)); В процедуре GetPagesCursor можно любое преобразование сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2002, 13:24 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
А я вляется ли правильной стратегия создания временных таблиц в описанном выше случае. Насrолько велики накладные расходы на создание, не приводит ли это к блокировкам? Сам перехожу с MS SQL и столкнулся с той же проблемой. Oracle 8.1.7... Хочется услышать мнение Гуру - как правильно перестроить логику хр. пр. MS SQL, которые возвращают результирующий набор? Через ref cursor, создавать вр. таблицы, использовать функции ? Как правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2003, 12:45 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
М-да.. с ответами негусто (( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2003, 13:54 |
|
||
|
Необходимо из хранимой процедуры вернуть набор данных
|
|||
|---|---|---|---|
|
#18+
Тема возврата набора значений из функции неоднократно обсуждалась в форуме, ищите. Я могу просто добавить, сделать можно ВСЕ, причем пути решения могут быть различными в зависимости от задачи и версии Oracle. еще ссылка (помимо этого форума) http://www.ln.com.ua/~openxs/projects/oracle/ora011.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2003, 14:04 |
|
||
|
|

start [/forum/topic.php?fid=52&gotonew=1&tid=1991243]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 453ms |

| 0 / 0 |
