如何使用oracle包来摆脱Global Temp表

时间:2010-06-13 15:19:43

标签: oracle plsql packages pipelined-function

我有一个示例查询,如下所示:

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 :(得分:0)

您需要使用TABLE()语法调用pipelined函数:

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

请注意,USERS上的子查询必须从该表返回一行。

答案 1 :(得分:0)

您不选择加入套餐。如果您打算在代码中使用它,您可以声明表类型的变量并批量收集。我还质疑你需要一个流水线功能。如果您只是将global-temporary表用作另一个查询的跳板,则可能只需使用WITH子句。我们需要更好地了解大局以推荐特定技术。全局临时表本身也不是坏事。