【问题标题】:how to use oracle package to get rid of Global Temp table如何使用 oracle 包摆脱 Global Temp 表
【发布时间】:2010-07-14 03:54:38
【问题描述】:

我有一个如下示例查询:

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)

【问题讨论】:

  • 你现在是如何使用临时表的,为什么要去掉它?在这个非常简单的情况下,您可能会更好地使用视图,但这可能并不总是合适的。但我不确定这个包是否能满足你的要求——正如 APC 所说,你只能在使用它时传入一组值。您目前也没有对传递的值做任何事情。听起来您希望该函数对用户表执行查询并返回一个保存结果的 PL/SQL 表,而不是拥有一个 SQL 临时表。
  • 你也应该看看这个,它比我解释得更好:stackoverflow.com/questions/2918466

标签: oracle plsql packages pipelined-function


【解决方案1】:

您需要使用 TABLE() 语法调用流水线函数:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2013-10-31
      相关资源
      最近更新 更多