我想创建一个动态游标,但是我的代码没有给我带来正确的数据。我做错了什么?
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;
答案 0 :(得分: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;
对于更大的IN子句列表,One of my other answer还有其他使用集合的方式。
答案 1 :(得分:0)
- 我在我们的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;