Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用oracle软件包摆脱全局临时表_Oracle_Plsql_Packages_Pipelined Function - Fatal编程技术网

如何使用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临时表。您还应该看看这一点,这比我所能解释的要好得多: