2016-10-26 2 views
1

Ich habe ein Skript, das eine XML-Datei öffnen und den Inhalt lesen und verarbeiten soll. Die PLSQL-Prozedur TEST_LOAD.BOB_LOAD wurde erfolgreich erstellt.Skript kann XMLTYPE-Argument nicht an PLSQL-Prozedur übergeben

TEST_LOAD.BOB_LOAD sieht wie folgt aus:

PROCEDURE BOB_LOAD(p_uuid IN varchar2, 
     xml_in IN xmltype, 
     msg_status OUT varchar2, 
     xml_out OUT xmltype); 

END BOB_LOAD; 
/

Das Skript unten nennt dieses Verfahren in der letzten Zeile und scheint die Ursache des Fehlers zu sein. Ich gehe davon aus, dass es die Variable x nicht als XMLTYPE erkennt.

DECLARE 
    xml_file UTL_FILE.FILE_TYPE; 
    chars_read INTEGER; 
    xml_clob CLOB; 
    xamount INTEGER :=32767; 
    char_buffer VARCHAR2(32767); 
    x XMLType; 
BEGIN 
xml_file := utl_file.fopen('/export/hm/testpit/bob', 'test.xml', 'r', xamount); 
    DBMS_LOB.CREATETEMPORARY(xml_clob, true); 
LOOP 
BEGIN 
UTL_FILE.GET_LINE(xml_file, char_buffer); 
    chars_read :=LENGTH(char_buffer); 
    DBMS_LOB.WRITEAPPEND(xml_clob, chars_read, char_buffer); 
    DBMS_LOB.WRITEAPPEND(xml_clob, 1, CHR(10)); 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    EXIT; 
    END; 
    END LOOP; 
    UTL_FILE.FCLOSE(xml_file); 
    x := XMLType.createXML(xml_clob); 
    TEST_LOAD.BOB_LOAD('9718fa05-9995-4f17-jk1k-763113b8f4a4', x); 
END; 
/

Allerdings, wenn ich das Skript ausführen oben Ich erhalte eine ORA-06550, PLS: 00306 Fehler sagen:

ORA-06550: line 39, column 3: 
PLS-00306: wrong number or types of arguments in call to 'BOB_LOAD' 
ORA-06550: line 39, column 3: 
PL/SQL: Statement ignored 

Antwort

2

Ihr Verfahren hat vier Parameter. Sie nennen es nur mit 2. Sie müssen es auch mit den out-Parametern aufrufen.

Viele einfache Art und Weise des Inhalt eine Datei in ein CLOB zu lesen:

function read_clob_from_file(p_directory varchar2 
           ,p_filename varchar2) return clob is 

     l_amt  number := dbms_lob.lobmaxsize; 
     l_dst_loc clob; 
     l_dst_offset number := 1; 
     l_lang_ctx number := dbms_lob.default_lang_ctx; 
     l_src_loc bfile; 
     l_src_offset number := 1; 
     l_warning number; 
    begin 

     l_src_loc := bfilename(p_directory, p_filename); 
     dbms_lob.createtemporary(l_dst_loc, true); 
     dbms_lob.fileopen(l_src_loc, dbms_lob.file_readonly); 
     dbms_lob.loadclobfromfile(l_dst_loc 
           ,l_src_loc 
           ,l_amt 
           ,l_dst_offset 
           ,l_src_offset 
           ,dbms_lob.default_csid 
           ,l_lang_ctx 
           ,l_warning); 
     dbms_lob.fileclose(l_src_loc); 
     return l_dst_loc; 
    end; 
Verwandte Themen