当我在商店程序下面运行时,它显示错误。这里有一些特殊的char相关问题,所以我不能生成xml文件,这里的xml格式与generate XML from oracle tables相同
Connecting to the database DB_old.
ORA-29285: file write error
ORA-06512: at "SYS.UTL_FILE", line 148
ORA-06512: at "SYS.UTL_FILE", line 889
ORA-06512: at "DBO_17FEB.EXPOR1", line 60
ORA-06512: at line 6
Process exited.
Disconnecting from the database DB_old.
-------------------
create or replace
PROCEDURE Expor1
(
V_TABLE_NAME IN varchar2
)
AS
BEGIN
----- Export table data
DECLARE
v_file UTL_FILE.file_type;
qryCtx DBMS_XMLGEN.ctxHandle;
result CLOB;
result1 CLOB;
v_FILENAME varchar2(30);
BEGIN
IF UPPER(V_TABLE_NAME) = 'PROJECT' THEN
qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||'' );
ELSIF UPPER(V_TABLE_NAME) = 'LOGFILE' THEN
qryCtx := dbms_xmlgen.newContext ('select LOG_ID, USER_ID,RUN_DATE,PROCESS,MPOID,MODE_,trim(STATUS) as STATUS,
trim(regexp_replace(unistr(NOTES), ''[[:punct:]] '','''')) as NOTES,
MARKDELETED from logfile where rownum<100 ' );
ELSE
qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||'' );
END IF;
v_FILENAME :=V_TABLE_NAME;
DBMS_XMLGEN.setMaxRows(qryCtx, 5);
v_file := UTL_FILE.fopen('MYXML', v_FILENAME || '.xml', 'W');
UTL_FILE.put_line(v_file, '<XML><'||v_FILENAME||'></'||v_FILENAME||'> <RECORDS>');
-- v_file := UTL_FILE.FOPEN('MYXML', v_FILENAME|| '.xml', 'R');
LOOP
DBMS_XMLGEN.SETNULLHANDLING(qryCtx ,null);
DBMS_XMLGEN.setRowSetTag(qryCtx, 0);
DBMS_XMLGEN.setRowTag(qryCtx, 'RECORD');
-- save the XML into the CLOB field
result := DBMS_XMLGEN.getXML(qryCtx);
--result := REPLACE( result, '<?xml version="1.0"?>','<XML><'||v_FILENAME||'>'||result1 ||'</'||v_FILENAME||'>' );
result := REPLACE( result, '<?xml version="1.0"?>',' ');
result := REPLACE( result, '<_x0030_>',' ');
result := REPLACE( result, '</_x0030_>',' ');
--result :=trim(result);
-- UTL_FILE.put_line(v_file, '');
EXIT WHEN DBMS_XMLGEN.getNumRowsProcessed(qryCtx) = 0;
-- store the XML to a XML files
UTL_FILE.put_line(v_file, result);
--UTL_FILE.put_line(v_file, '</XML>');
END LOOP;
UTL_FILE.put_line(v_file, '</RECORDS></XML>');
UTL_FILE.FCLOSE(v_file);
END;
END Expor1;
i am not able to handle some special char like : & / ; :/ . etc please help
答案 0 :(得分:0)
ORA-29285: file write error
与您之前提到的字符转换错误不同,即ORA-31061: XDB error: special char to escaped char conversion failed
。你真的不清楚你得到了什么错误;如果它是文件1那么字符转换是不相关的。
当我针对我的表运行我的代码版本时,它适用于较小的表,如果ORA-06502: PL/SQL: numeric or value error
超过32k字符,则获取result
;或ORA-29285
如果超过32k而没有换行符。您已经丢失了clob
上的循环,将其以块的形式写入文件。要输出更大的值,就像我之前做的那样:
position pls_integer := 1;
chars pls_integer := 32767;
...
while position < dbms_lob.getlength(result) loop
utl_file.put(v_file, dbms_lob.substr(result, chars, position));
utl_file.fflush(v_file);
position := position + chars;
end loop;
不确定为什么你在程序中有一个内部块(declare
/ begin
/`end')。
如果您收到ORA-31061
,那么我仍然不清楚哪些数据导致您出现问题,但假设您所做的NOTES
转换解决了这个问题,而您仍然看到ORA -31061当你为LOGFILE
表调用它时,那可能是因为你重置了qryCtx
。
您在代码中的第23行创建了:
qryCtx := dbms_xmlgen.newContext ('select LOG_ID,
USER_ID,RUN_DATE,PROCESS,MPOID,MODE_,STATUS,
regexp_replace(unistr(NOTES), ''[[:punct:]]'','''') as NOTES,
MARKDELETED from logfile' );
...但是在您执行此操作的if
/ elsif
/ else
块后,然后在第39行用以下内容覆盖它:
qryCtx := dbms_xmlgen.newContext ('SELECT * from '||V_TABLE_NAME ||'' );
因此,当您再调用getXML(qryCtx)
时,您未获得NOTES
的修改值。