如何使用oracle软件包摆脱全局临时表
我有一个如下的示例查询:如何使用oracle软件包摆脱全局临时表,oracle,plsql,packages,pipelined-function,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_r
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的新手…创建此软件包花费了很长时间。但现在我想不出如何摆脱我的“1”
我怎么能说
INSERT INTO <newly created package> (select fnma, name from users)
您需要使用表语法调用管道函数:
select *
from table (select fname_lname.fname_lname_func(fnma, name)
from users
where user_id = 123 )
/
请注意,对用户的子查询必须返回该表中的一行。您不能选择到包中。如果希望在代码中使用它,可以声明表类型的变量并将其大容量收集到其中。我还质疑您是否需要流水线函数。如果您只是使用全局临时表作为另一个查询的跳板,那么您可能只需要使用WITH子句。我们需要更好地了解全局,才能推荐一种特定的技术。全局临时表本身也不坏。目前您是如何使用临时表的,为什么要放弃它?在这种非常简单的情况下,您最好使用视图,但这可能并不总是合适的。但我不确定这个软件包是否能满足您的要求——正如APC所指出的,您只能在使用它的时候传入一组值。您当前也不会对传递的值执行任何操作。听起来您希望函数对用户表执行查询并返回一个包含结果的PL/SQL表,而不是SQL临时表。您还应该看看这一点,这比我所能解释的要好得多: