2010-06-13 51 views
0

我有一个简单的查询象下面这样:如何使用Oracle软件包摆脱全局临时表

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) 
+0

你现在怎么使用临时表,为什么你想摆脱它?在这种非常简单的情况下,你可能会比较好看,但这可能并不总是合适的。但是我不确定这个软件包会做你想做的事 - 就像APC所说的那样,你只能在你使用它的时候传入一组值。您目前也不会对传递的值做任何事情。这听起来像你希望函数在用户表上执行查询并返回一个保存结果的PL/SQL表,而不是有一个SQL临时表。 – 2010-06-14 16:34:59

+0

你也应该看看这个,这解释了它比我所能做的更好:http://stackoverflow.com/questions/2918466/ – 2010-06-14 16:43:45

回答

0

您需要使用表来调用管道函数()的语法:

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

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

0

您不会选择包装。如果你打算在代码中使用它,你可以声明一个你的表类型的变量并批量收集。我也质疑你需要一个流水线功能。如果你只是使用全局临时表作为另一个查询的跳板,那么你可以直接使用WITH子句。我们需要一个更好的想法来推荐一个特定的技术。全局临时表也不是固有的不好的。