Процедура загрузки файла XML в таблицу Oracle - PullRequest
0 голосов
/ 13 октября 2019

У меня есть требование для чтения данных из XML-файла и загрузки в таблицу Oracle. У меня есть описанная ниже процедура, и у меня есть исключение

ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275
ORA-06512: at "SYS.DBMS_LOB", line 1014
ORA-06512: at "AAA.INSERT_XML_EMPS", line 14
ORA-06512: at line 10
Process exited.
Disconnecting from the database

У меня есть каталог на диске C. Вот так, C: / XMLSTORE. он содержит файлы XML, которые я хотел бы загрузить в таблицу Oracle. Этот каталог имеет полные права. Проверили, что права доступа к каталогам в Oracle имеют разрешения READ, WRITE, EXECUTE.

SELECT * 
  FROM all_tab_privs 
 WHERE table_name = 'XMLSTORE1'; 

I tried using "dbms_lob.createtemporary()" as well. Can anyone please let me know what am i doing wrong here..

PROCEDURE Has an exception:

    create or replace PROCEDURE insert_xml_emps
    (p_directory in varchar2,p_filename  in varchar2, vtableName  in varchar2) as
      v_filelocator    BFILE;
      v_cloblocator    CLOB;
      l_ctx            DBMS_XMLSTORE.CTXTYPE;
      l_rows           NUMBER;
      v_amount_to_load NUMBER;
      dest_offset      NUMBER := 1;
      src_offset       NUMBER := 1;
      lang_context     NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
    warning          NUMBER;
    BEGIN
    dbms_lob.createtemporary(v_cloblocator, true);
    v_filelocator := bfilename(p_directory, p_filename);
    dbms_lob.open(v_filelocator, dbms_lob.file_readonly);
    v_amount_to_load := DBMS_LOB.getlength(v_filelocator);

    DBMS_LOB.LOADCLOBFROMFILE(v_cloblocator,
                              v_filelocator,
                              v_amount_to_load,
                              dest_offset,
                              src_offset,
                              0,
                              lang_context,
                              warning);

    l_ctx := DBMS_XMLSTORE.newContext(vTableName);
    DBMS_XMLSTORE.setRowTag(l_ctx, 'ROWSET');
    DBMS_XMLSTORE.setRowTag(l_ctx, 'IBSCOLYTD');
    -- clear the update settings
    DBMS_XMLStore.clearUpdateColumnList(l_ctx);
    -- set the columns to be updated as a list of values
    DBMS_XMLStore.setUpdateColumn(l_ctx, 'ACTNOI');
    DBMS_XMLStore.setUpdateColumn(l_ctx, 'MEMONOI');
    DBMS_XMLStore.setUpdatecolumn(l_ctx, 'MEMODTEI');
    DBMS_XMLStore.setUpdatecolumn(l_ctx, 'AMOUNTI');
    DBMS_XMLStore.setUpdatecolumn(l_ctx, 'BRCDSI');
    DBMS_XMLStore.setUpdatecolumn(l_ctx, 'TYPEI');
    DBMS_XMLStore.setUpdatecolumn(l_ctx, 'TRANSMONI');
    -- Now insert the doc.
    l_rows := DBMS_XMLSTORE.insertxml(l_ctx, v_cloblocator);
    DBMS_XMLSTORE.closeContext(l_ctx);
    dbms_output.put_line(l_rows || ' rows inserted...');
    dbms_lob.close(v_filelocator);
    DBMS_LOB.FREETEMPORARY(v_cloblocator);
    END;
...