Dynamic 弱引用游标的表达式类型错误
我试图获取一个ref游标来运行动态查询并返回结果。下面是我尝试做的一个例子: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; 为什么这
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进行第二种方法