2014-09-25 88 views
0

我想創建一個動態光標,但是我的代碼並沒有給我帶來正確的數據。我究竟做錯了什麼?動態光標Oracle

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

因爲在串後的QUERY_STRING一些語法問題將會像_IN''V1','V2'_ .. – 2014-09-25 19:56:26

回答

0

總之,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子句列表。

0

--I使用的表IN OUR DB ORACLE 11G R2 --there是高於我糾正 --I移動BEGIN和相加的輸出

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;