Dynamic 弱引用游标的表达式类型错误

Dynamic 弱引用游标的表达式类型错误,dynamic,plsql,oracle10g,ref-cursor,Dynamic,Plsql,Oracle10g,Ref Cursor,我试图获取一个ref游标来运行动态查询并返回结果。下面是我尝试做的一个例子: 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; 为什么这

我试图获取一个ref游标来运行动态查询并返回结果。下面是我尝试做的一个例子:

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;

为什么这会给我一个错误的说法:表达式的类型是错误的?这个引用游标是弱类型的,不是吗?救命啊

Oracle文档中提到,
Select
语句支持
CHAR
VARCHAR2
CLOB
不是NCHAR或NVARCHAR2
)。 如果要使用
NVARCHAR
实现,那么我知道的唯一解决方案是使用
CHAR\u CS
参数将CHAR转换为数据库字符集。输出数据类型为
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;
无错误。

如果
nvarhar2
不是强制性的,则尝试使用提供的基本数据类型创建

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; 
参考资料:


Oracle文档中提到,
Select
语句支持
CHAR
VARCHAR2
CLOB
不是NCHAR或NVARCHAR2
)。 如果要使用
NVARCHAR
实现,那么我知道的唯一解决方案是使用
CHAR\u CS
参数将CHAR转换为数据库字符集。输出数据类型为
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;
无错误。

如果
nvarhar2
不是强制性的,则尝试使用提供的基本数据类型创建

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; 
参考资料:


NVARCHAR2或VARCHAR2对我来说并不重要,我甚至不知道两者之间有什么区别。谢谢你的提示!我的头撞在墙上1@Adamantine:是的,然后使用第二种方法使用varchar2NVARCHAR2或VARCHAR2对我来说并不重要,我甚至不知道两者之间有什么区别。谢谢你的提示!我的头撞在墙上1@Adamantine:是,然后使用varchar2进行第二种方法