【问题标题】:Dynamic cursor Oracle动态游标 Oracle
【发布时间】:2014-11-20 16:37:46
【问题描述】:

我想创建一个动态游标,但我的代码没有给我带来正确的数据。我做错了什么?

DECLARE
 VAR1 VARCHAR2(500);
 CURSOR CUR1 IS
  SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN (VAR1);

 BEGIN
  VAR1 := q'['V1','V2']';
  FOR REG IN CUR1 LOOP
   DBMS_OUTPUT.PUT_LINE(REG.COL1);
  END LOOP;
END;

【问题讨论】:

  • 因为 IN 字符串会像 IN ''V1','V2'' ..

标签: oracle plsql dynamic-sql


【解决方案1】:

简而言之,IN 子句不支持绑定变量。它只支持值,以您使用的方式。您需要像IN (var1, var2) 一样指定它;

在不认识你的情况下,你使用了绑定变量。一种解决方法是使用 REFCURSOR 通过动态形成查询字符串。

DECLARE
 VAR1 VARCHAR2(500);
 CUR1 SYs_REFCURSOR;
 QUERY_STRING VARCHAR2(2000) := 'SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN';

 MYREC IS RECORD 
 (
   COL1 VARCHAR(1000);
 );

 myrecord MYREC;

 BEGIN
  VAR1 := q'['V1','V2']';
  QUERY_STRING:= QUERY_STRING||'('||VAR1||')';

  OPEN CUR1 FOR QUERy_STRING;

    LOOP
      FETCH CUR1 INTO myrecord;
      DBMS_OUTPUT.PUT_LINE(myrecord.COL1);
      EXIT WHEN v_my_ref_cursor%NOTFOUND;
        ..
      -- your processing
    END LOOP;

  CLOSE CUR1;

END;

One of my other answer 也有其他使用集合的方式,用于更大的 IN 子句列表。

【讨论】:

    【解决方案2】:

    --我在我们的 DB ORACLE 11G R2 中使用了一个表 --上面有一些语法问题我更正了 --我在BEGIN之后移动了QUERY_STRING并添加了输出

    DECLARE
     VAR1 VARCHAR2(500);
     CUR1 SYS_REFCURSOR;
     QUERY_STRING VARCHAR2(2000);
    
     TYPE MYREC IS RECORD 
     (
       WO_NBR VARCHAR(1000)
     );
    
     myrecord MYREC;
    
    BEGIN
      VAR1 := q'['45466','45432']';
      QUERY_STRING := 'SELECT T.WO_NBR FROM WO_SCHED T WHERE T.WO_NBR IN  ('||VAR1||')';
      DBMS_OUTPUT.PUT_LINE(VAR1);
      DBMS_OUTPUT.PUT_LINE(QUERY_STRING);
    
      OPEN CUR1 FOR QUERY_STRING;
    
        LOOP
          FETCH CUR1 INTO myrecord;
          DBMS_OUTPUT.PUT_LINE(myrecord.WO_NBR);
          EXIT WHEN CUR1%NOTFOUND;
    
          -- your processing
        END LOOP;
    
      CLOSE CUR1;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多