2016-04-07 9 views
0
 varSQL: = 'DECLARE 


     varOptionId NUMBER; 
     varXML XMLTYPE; 
     varHsCode VARCHAR2(200); 
     varHsCodeCount NUMBER; 
     varId NUMBER; 
     RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 

     BEGIN 

     varXML:=:refXML; 


     varHsCode:= varXML.EXTRACT('/OBJECT/HsCodes/HsCode/text()').GETSTRINGVAL(); 


     :out:=varHsCode; 

     END'; 

     EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 

Dies gibt die folgenden Fehler:Passing ein XML in Immediate Execute

ORA-06550: Zeile 9, Spalte 15: PLS-00382: Ausdruck von falschem Typ ORA-06550 ist: Linie 9, Spalte 2: PL/SQL: Anweisung ignoriert ORA-06512: bei "BIZZXE_V2_SCH.SYSTEM_UTILITY", Zeile 225 06550. 00000 - "Zeile% s, Spalte% s: \ n% s" * Ursache: Normalerweise ein PL/SQL-Kompilierungsfehler * Aktion:

Ist es möglich, ein XML zu übergeben?

+1

warum führen Sie es nicht direkt aus? – ibre5041

+0

Keine Ahnung, warum Sie dafür dynamisches SQL verwenden sollten, aber Sie haben unescape einfache Anführungszeichen im varSQL-String-Wert, so dass ich überrascht bin, dass überhaupt kompiliert wird. Wir haben keinen Kontext. Können Sie also bestätigen, dass die Zeile 'EXECUTE IMMEDIATE' in Zeile 225 Ihres Pakethauptteils steht, und dies ist ein Laufzeitfehler, der beim Kompilieren des Pakets nicht angezeigt wird? –

+0

Und ja, Sie können einen XMLType übergeben, nur mit einer Version des Codes mit einigen Fehlern behoben - fehlende Semikolon, falsche Zuordnung in der ersten Zeile, migrierte Anführungszeichen. Es wäre hilfreich, wenn Sie zeigen würden, was Sie tatsächlich ausführen, als einen vollständigen Codeblock, den wir ausführen können, um den angezeigten Fehler neu zu erstellen. Ist PXML tatsächlich XMLType oder varchar2/CLOB? Sie erhalten diesen Fehler, wenn es eine Zeichenfolge ist, also ziemlich sicher, dass das Problem ist. –

Antwort

0

Ja, können Sie eine XMLType Variable als Bind-Parameter übergeben:

declare 
    varsql varchar2(1024); 
    varout varchar2(4); 
    pxml xmltype := xmltype('<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>'); 
begin 
    varSQL := 'DECLARE 
varOptionId NUMBER; 
varXML XMLTYPE; 
varHsCode VARCHAR2(200); 
varHsCodeCount NUMBER; 
varId NUMBER; 
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 
BEGIN 
varXML:=:refXML; 

varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL(); 

:out:=varHsCode; 
END;'; 

    EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 
    dbms_output.put_line(varOut); 
end; 
/

PL/SQL procedure successfully completed. 

Test 

Der Fehler, den Sie bekommen, weil Sie PXML als String deklariert haben; entweder ein varchar2 oder CLOB Variable:

declare 
    varsql varchar2(1024); 
    varout varchar2(4); 
</HsCodes></OBJECT>'); 
    pxml varchar2(64) := '<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>'; 
begin 
    varSQL := 'DECLARE 
varOptionId NUMBER; 
varXML XMLTYPE; 
varHsCode VARCHAR2(200); 
varHsCodeCount NUMBER; 
varId NUMBER; 
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL); 
BEGIN 
varXML:=:refXML; 

varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL(); 

:out:=varHsCode; 
END;'; 

    EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut; 
    dbms_output.put_line(varOut); 
end; 
/

Error report - 
ORA-06550: line 9, column 10: 
PLS-00382: expression is of wrong type 
ORA-06550: line 9, column 2: 
PL/SQL: Statement ignored 
ORA-06512: at line 21 

In Ihrem Beispiel gibt es keinen Grund ohnehin dynamische SQL zu verwenden, aber vielleicht Ihr reale Welt Beispiel ist komplizierter.

Verwandte Themen