sql - 在 Cursor 中的情况

标签 sql oracle plsql

未经测试的水域,我正在尝试找到一种缓解问题的方法。而不是在 PL-SQL 的游标中进行嵌套选择。我试图在游标中提出一个案例。由于游标可以有不同的输入参数,因此我需要相应地对内容进行排序。

这可能吗?我的代码看起来像这样。很容易读懂 ao_in 是 Inparam。

PROCEDURE theProcedure (ao_in IN VARCHAR2)

CURSOR order_cur
  IS
 Case when ao_in = 'NIEC' 
  then          
      SELECT t1.nr, t1.status$nr
      FROM eh_order_t@NGEXT_DBLINK t1
      WHERE     t1.status$nr IN (3, 6)
      AND ao_in =
                     DECODE (ao_in, 'NIEC', ao_in, get_ehorder_ao (t1.nr))
              AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
     ORDER BY t1.skapad_dat ASC;

  when ao_in = 'DSSP'  then
  SELECT t1.nr, t1.status$nr
      FROM eh_order_t@NGEXT_DBLINK t1
      WHERE     t1.status$nr IN (3, 6)
      AND ao_in =
                     DECODE (ao_in, 'DSSP', ao_in, get_ehorder_ao (t1.nr))
              AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
     ORDER BY t1.skapad_dat ASC;
  when ao_in = 'ALLA'

  SELECT t1.nr, t1.status$nr
      FROM eh_order_t@NGEXT_DBLINK t1
      WHERE     t1.status$nr IN (3, 6)
      AND ao_in =
                     DECODE (ao_in, 'ALLA', ao_in, get_ehorder_ao (t1.nr))
              AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
     ORDER BY t1.skapad_dat ASC;
  end

最佳答案

你想要的可以用 OPEN-FOR 完成语句,像这样:

PROCEDURE theProcedure (ao_in IN VARCHAR2)

    TYPE t_cur IS REF CURSOR;
    order_cur t_cur;

begin
    Case when ao_in = 'NIEC' 
      then  
        open order_cur for 
              SELECT t1.nr, t1.status$nr
              FROM eh_order_t@NGEXT_DBLINK t1
              WHERE     t1.status$nr IN (3, 6)
                AND ao_in = 'NIEC'
                AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
             ORDER BY t1.skapad_dat ASC;

      when ao_in = 'DSSP'  then
        open order_cur for
              SELECT t1.nr, t1.status$nr
              FROM eh_order_t@NGEXT_DBLINK t1
              WHERE     t1.status$nr IN (3, 6)
                AND ao_in = 'DSSP'
                AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
             ORDER BY t1.skapad_dat ASC;
      when ao_in = 'ALLA'
        open order_cur for
            SELECT t1.nr, t1.status$nr
            FROM eh_order_t@NGEXT_DBLINK t1
            WHERE     t1.status$nr IN (3, 6)
                AND ao_in ='ALLA'
                AND t1.nr = DECODE (order_in, NULL, t1.nr, order_in)
         ORDER BY t1.skapad_dat ASC;
    end;
end;

请注意,不需要对 ao_in 参数进行解码评估,因为 已经在 case 语句中进行了评估。 我假设 order_in 是在原始代码的某处声明的,并且为了简化没有发布在这里,否则应该声明它。

关于sql - 在 Cursor 中的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513236/

相关文章:

oracle - 如何获得 DBTIMEZONE 和 SESSIONTIMEZONE 之间的数值差异?

oracle - 获取重定向 URL 的 PL/SQL 代码

mysql - 查询某个事件在给定时间发生的频率

c++ - 如何从 C++ 查询数据库表

css - StyleClass 被忽略

oracle - com.oracle :ojdbc6 in version 11. 2.0.3 有什么特别之处?

java - IDEA Intellij 如何调试从 Java 类调用的 PL/SQL 代码

database - 在 Perl 脚本中运行 PL/SQL 过程

sql - 维护参照完整性-好还是坏?

java - 使用带有注解的MyBatis如果发生MySql错误则抛出自己的自定义异常