как использовать пакет Oracle для избавления от таблицы Global Temp - PullRequest
0 голосов
/ 13 июня 2010

У меня есть пример запроса, подобный приведенному ниже:

INSERT INTO my_gtt_1 (fname, lname) (select fname, lname from users)

В попытке избавиться от временных таблиц я создал пакет:

create or replace package fname_lname AS

Type fname_lname_rec_type is record (
fname varchar(10),
lname varchar(10)
);

fname_lname_rec fname_lname_rec_type

Type fname_lname_tbl_type is table of fname_lname_rec_type;

function fname_lname_func
(
   v_fnam in varchar2, 
   v_lname in varchar2
)return fname_lname_tbl_type pipelined;

будучи новичком в Oracle ...создание этого пакета заняло много времени.но теперь я не могу понять, как избавиться от my_gtt_1

, как я могу сказать ...

INSERT INTO <newly created package> (select fnma, name from users)

Ответы [ 2 ]

0 голосов
/ 13 июля 2010

Вы не выбираете в пакеты.Вы можете объявить переменную вашего табличного типа и массового сбора в нее, если вы собираетесь использовать ее в коде.Я также подвергаю сомнению вашу потребность в конвейерной функции.Если вы просто используете глобальную временную таблицу в качестве плацдарма для другого запроса, вы, вероятно, можете просто использовать предложение WITH.Нам нужно лучше понять общую картину, чтобы рекомендовать конкретную технику.Глобальные временные таблицы тоже не плохие.

0 голосов
/ 14 июня 2010

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

select * 
from table (select fname_lname.fname_lname_func(fnma, name) 
            from users
            where user_id = 123 )
/

Обратите внимание, что подзапрос в USERS должен возвращать одну строку из этой таблицы.

...