2010-12-09 4 views
1

Ich muss eine Funktionssignatur ändern, um einen Parameter (p_param) vom Typ CLOB zu haben, der vorherige Typ war nvarchar2. Das verursachte mir Probleme, wenn der vorhandene Code || verwendete concat.Concat CLOB in PL/SQL für sofortige Ausführung

Hier ist das vorhandene Snippet, das für den NVarchar2 gut funktioniert, aber anscheinend, wenn Sie || verwenden um ein CLOB zu contrahieren behandelt es es wie ein nvarchar2, was ein Problem ist, wenn das Zeichenlimit von nvarchar2 überschritten wird.

execute immediate  
    'select p.person_id 
    from person p where p.id in (' || p_param || ')' 
bulk collect into persons; 

Ich habe versucht, das obige Snippet zu ändern

execute immediate 
    concat(concat('select p.id from person p where p.person_id in(',p_param),')') 
    bulk collect into members; 

seinen Dieser kompiliert nicht, ich erhalte eine Fehlermeldung,

PLS-00382: Ausdruck ist von falschem Typ

Ich bin neu in PL/SQL, danke für die Hilfe.

+0

Erstellen Sie so lange eine Liste von Personen, dass sie nicht in eine VARCHAR2- oder NVARCHAR2-Variable passt? Ich denke nicht, dass Oracle SQL so lange gerne hat. Ich würde den Ansatz völlig in Frage stellen. –

+0

Ja, ich stimme dir vollkommen zu. Ich behalte etwas Code und möchte vermeiden, das Ganze neu zu schreiben. – Andy

Antwort

3

Solange Sie diesen besonderen Code-Snippet zu ändern haben DBMS_SQL zu verwenden, würde ich stark es zu ändern erwägen den dynamischen SQL-Ansatz vollständig zu beseitigen. Stattdessen würde ich str2tbl Funktion nehmen Tom, ändern sie eine CLOB nehmen (eine nachfolgende Antwort hat already done this) und dann den Code ändern zu

select p.person_id 
    bulk collect into persons 
    from person p 
where p.id in (select column_value 
        from str2tbl(p_param)) 

Auf ein Minimum, das Sie eine große Anzahl von nicht vermeiden Schaffung lassen sharable-Anweisungen, reduzieren Sie die Anzahl der harten Parser und den Zeitaufwand für die Analyse und reduzieren Sie den Druck auf den gemeinsam genutzten Pool. Es kann auch das Risiko von SQL Injection Attacken reduzieren.

+1

+1 - das ist der Ansatz, den ich nehmen würde. – APC