2012-04-05 10 views
1

Ich versuche, einen Ref-Cursor zu erhalten, um eine dynamische Abfrage auszuführen und die Ergebnisse zurückzugeben. Hier ist ein Beispiel dafür, was ich zu tun habe versucht:Ausdruck ist falscher Typ von einem schwachen Referenzcursor

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; 

warum dies mir sagen, einen Fehler nicht geben: Ausdruck ist von falschem Typ? Dieser Ref-Cursor ist schwach typisiert, nicht wahr? Hilfe!

Antwort

1

Es ist in dem Oracle-Dokument erwähnt, dass die Stütz Select Statement CHAR, VARCHAR2 oder CLOB (not NCHAR or NVARCHAR2). Wenn Sie mit NVARCHAR implementieren möchten, ist die einzige Lösung, die ich kenne, translate USING CHAR_CS Argument konvertiert Char in den Datenbank-Zeichensatz. Der Ausgabedatentyp ist 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.

Wenn NVARCHAR2 nicht zwingend notwendig ist, dann versuchen Sie mit grundlegenden Datentypen zur Verfügung gestellt zu erstellen.

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; 

Referenzen:

Translate...USING

Open For Statement

+0

NVARCHAR2 oder VARCHAR2 spielt keine Rolle für mich, und ich bin nicht einmal bewusst einen Unterschied zwischen den beiden. Danke für den Tipp! Ich schlug meinen Kopf gegen die Wand auf dieser 1 – Adamantine

+0

@Adamantine: Ja, dann gehen Sie mit der zweiten Ansatz mit varchar2 –

Verwandte Themen