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

时间:2012-04-05 18:06:57

标签: dynamic plsql oracle10g ref-cursor

我试图获取一个引用游标来运行动态查询并返回结果。这是我正在尝试做的一个例子:

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 个答案:

答案 0 :(得分:1)

Oracle文档中提到Select语句支持CHARVARCHAR2CLOBnot 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; 

参考文献:

Translate...USING

Open For Statement