我试图获取一个引用游标来运行动态查询并返回结果。这是我正在尝试做的一个例子:
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;
为什么这会给我一个错误说:表达式错误?这个引用游标是弱类型的不是吗?救命啊!
答案 0 :(得分:1)
Oracle文档中提到Select
语句支持CHAR
,VARCHAR2
或CLOB
(not NCHAR or NVARCHAR2
)。
如果你想用NVARCHAR
实现,那么我知道的唯一解决方案就是translate
使用CHAR_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;
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;
参考文献: