2012-04-05 47 views
1

我正在嘗試獲取引用遊標來運行動態查詢並返回結果。這裏是什麼,我試圖做一個例子:從弱參考光標表達式是錯誤類型

DECLARE 
    TYPE CUR_DATA IS REF CURSOR; 
    OUT_DATA CUR_DATA; 
    SQL_Statement  NVARCHAR2(8000); 
BEGIN 
    SQL_Statement := ' SELECT * FROM dual ';   
    OPEN OUT_DATA FOR SQL_Statement; 
END; 

爲什麼這給我一個錯誤說:表達式類型錯誤的?這個遊標是弱類型的,不是嗎?幫幫我!

回答

1

在Oracle文檔中提到Select聲明支持CHAR,VARCHAR2CLOBnot NCHAR or NVARCHAR2)。 如果你想實現與NVARCHAR然後我知道的唯一的解決方案是translate使用CHAR_CS參數將字符轉換爲數據庫字符集。輸出數據類型是VARCHAR2

DECLARE 
    TYPE CUR_DATA IS REF CURSOR; 
    OUT_DATA CUR_DATA; 
    SQL_Statement  NVARCHAR2(4000); --declare this as VARCHAR2 
    SQL_Statement_var  VARCHAR2(4000); 
BEGIN 
    SQL_Statement := N'SELECT * FROM dual ';   
    SQL_Statement_var := TRANSLATE(SQL_Statement USING CHAR_CS); 
    OPEN OUT_DATA FOR SQL_Statement_var; 
END; 

No errors.

如果NVARCHAR2不是強制性的,那麼嘗試用提供的基本數據類型來創建。

DECLARE 
    TYPE CUR_DATA IS REF CURSOR; 
    OUT_DATA CUR_DATA; 
    SQL_Statement  VARCHAR2(4000); --declare this as VARCHAR2 
BEGIN 
    SQL_Statement := ' SELECT * FROM dual ';   
    OPEN OUT_DATA FOR SQL_Statement; 
END; 

參考文獻:

Translate...USING

Open For Statement

+0

NVARCHAR2或VARCHAR2不事關我,我根本不知道這兩者之間的差別。謝謝你的提示!我在我的頭上撞牆1 – Adamantine 2012-04-05 20:02:39

+0

@Adamantine:是的,然後用第二種方法使用varchar2 – 2012-04-05 20:05:03