2012-04-05 2 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, 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; 

Ссылки:

Translate...USING

Open For Statement

+0

NVARCHAR2 или VARCHAR2 Doesnt дело ко мне, и я даже не знают разницы между ними. Спасибо за совет! Я ударился головой о стену на том, что 1 – Adamantine

+0

@Adamantine: Да, тогда идите со вторым подходом, используя varchar2 –

Смежные вопросы