【问题标题】:PLSQL - Parameter cursor with different returnPLSQL - 具有不同返回的参数游标
【发布时间】:2015-03-16 12:01:57
【问题描述】:

我知道标题什么也没说...但论点有点“复杂”,无法在一行中解释。

我写的所有代码只是一个例子,我当前的代码来自其他表等,但行为是一样的。

我已经定义了一个像这样的游标:

CURSOR emp_cur (l_type)
IS
    with emp_general AS (select *
                           from emp
                          where type = l_type),
         emp_active AS (select *
                          from emp_geral
                         where status = ACTIVE_STATUS),
        emp_inactive AS (select *
                           from emp_general
                          where status = INACTIVE_STATUS)
    select distinct name, department
      from emp_active
     minus
    select distinct name, department
      from emp_inactive;

此游标采用过滤器 emp 类型的参数并减去以获取 ACTIVE - INACTIVE emp。

这个光标返回namedepartment

现在必须用不同的“选择”语句声明不同的游标,例如:

select location
  from emp_active
select location
  from emp_active

我不想复制我的光标只是为了更改选择。 有办法做到这一点并避免代码重复(不使用 DynamicSQL - 在生产环境中难以调试)?

【问题讨论】:

  • 我可以考虑使用 GTT。(全局临时表)。看我的回答。
  • 您是说要使用同一个光标按类型或按位置查询员工吗?
  • 你是否也意识到你的SQL是不必要的复杂可以大大简化?不过,我不确定这是否适用于您的真实查询。

标签: oracle plsql


【解决方案1】:

您可以显式创建两个全局临时表一次不是即时)

  1. emp_active_gtt
  2. emp_inactive_gtt

这样,每个临时表将分别具有活动和非活动记录的整个结果集。

例如,在代码中你会这样做:

insert into emp_active_gtt 
select *
from ....
where status ='ACTIVE'

同样,对于非活动记录:

insert into emp_inactive_gtt 
select *
from ....
where status ='INACTIVE'

您现在可以在会话范围内的任何地方使用这两个表来获取所需的行。

https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#i2153132https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#i2153132的文档中阅读有关 GTT 的更多信息

【讨论】:

  • 这可能是一个解决方案(我从未使用过 GTT)。如果有一天我必须更改 emp 表,我需要删除关联的 GGT,然后重新创建它们?我必须创建两个 GTT,然后在它们上插入,然后(有两个功能)我为我想要的行为做不同的选择。我很好理解?.ps:GGT的默认设置是当事务完成(提交)时,其上的数据将被删除,对吗?两个不同的交易的 GGT 为空。
  • 根据您的要求,您可以将 GTT 创建为 on commit preserve rowsdelete rows。而且,您不必删除 GTT,它与任何表都没有关联。如果您专门将 GTT 用于特定过程,例如在您的 EMP 表操作的情况下,您需要做的就是,每当您稍后使用 EMP 表时,您只需要更改 GTT。它可以像任何其他表一样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多