可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to create a dynamic cursor, but my code does not bring me the correct data. What am I doing wrong?
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;
回答1:
In short, IN clause doesn't support bind variables.. It supports for only value,in the way you used.. You need to specify it like IN (var1, var2)
;
Without knowing you , you have used bind variables. One workaround is use REFCURSOR
By forming a query string dynamically.
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 also has other way using collections, for bigger IN clause list.
回答2:
--I USED A TABLE IN OUR DB ORACLE 11G R2 --there are some syntax issues above that I corrected --I moved the QUERY_STRING after the BEGIN and added output
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;