Как использовать вложенную таблицу в курсоре - PullRequest
2 голосов
/ 13 декабря 2011
CREATE PROCEDURE( p_cur  OUT a_cur)
IS
type rec is record( a varchar2(2), b number, c number);
type tab is table of rec;
tab1 tab:=tab();
begin

tab1.extend;
tab1(tab1.last).a:='as';
tab1(tab1.last).b:=2;
tab1(tab1.last).c:=3;
tab1.extend;
tab1(tab1.last).a:='jj';
tab1(tab1.last).b:=2;
tab1(tab1.last).c:=3;

--??---
end;

Я создал вложенную таблицу здесь tab1, но моя проблема в том, что я хочу использовать эту вложенную таблицу в курсоре и хочу вернуть целые записи, используя эту вложенную таблицу, ограничение состоит в том, что я не хочу использовать какие-либовременный столЯ использую RDBMS как ORACLE

1 Ответ

4 голосов
/ 13 декабря 2011

Если вы хотите использовать коллекцию, как если бы она была таблицей, вам нужно будет посмотреть на функцию TABLE():

Вот пример: http://www.dobosz.at/oracle/select-from-plsql-table/

И еще один хороший ресурс здесь: http://www.databasejournal.com/features/oracle/article.php/2222781/Returning-Rows-Through-a-Table-Function-in-Oracle.htm

Вам нужно будет объявить тип коллекции в базе данных, а затем заполнить ее в своей процедуре и затем выбрать из нее.

Я ответил на вопросвопрос с использованием этого метода здесь: Можно ли использовать табличную переменную в операторе выбора where?

Посмотрите, как это должно помочь вам в том, чего вы пытаетесь достичь.

Надеюсь, это поможет ...

РЕДАКТИРОВАТЬ: В ответ на ваш вопрос этот код должен делать то, что вы хотите.Я не проверял его, но он должен быть очень близок к тому, что вам нужно, и вы можете отладить его при необходимости.

-- Create the relevent Object
CREATE TYPE data_obj_type AS OBJECT (
   a VARCHAR2(2),
   b NUMBER,
   c NUMBER
);

Тип создан

-- Create the collection to hold the objects
CREATE TYPE table_obj_type IS TABLE OF data_obj_type;

Тип создан

CREATE OR REPLACE
PROCEDURE cursor_values(
   p_cur OUT sys_refcursor
)
IS
   -- Create a variable and initialise it
   tab1 table_obj_type := table_obj_type();
BEGIN
   -- Populate the tab1 collection
   tab1.extend;
   tab1(tab1.last) := data_obj_type('as', 2, 3);
   tab1.extend;
   tab1(tab1.last) := data_obj_type('jj', 2, 3);
   --
   -- Open ref_cursor for output
   OPEN p_cur FOR
      SELECT a,
             b,
             c
        FROM TABLE(CAST(tab1 AS table_obj_type));
END cursor_values; 

Примечание: код с этой страницы изменен: http://www.akadia.com/services/ora_return_result_set.html

...