我有一個程序,從表中讀取數值并生成一個csv檔案,然后郵寄給他們。這個程序一直作業得很好,直到我在DB中輸入了新的條目,之后它就不能生成CSV檔案了。該程序拋出一個例外 "ORA-06502: PL/SQL: numeric or value error: character string buff",我試圖列印從表中讀取的值,以檢查它是否正常作業。
通過列印值,我可以看到其中一個新條目沒有被正確讀取,我相信這可能是問題的原因。
我已經檢查了O Brien后面的值被列印在新行中的原因,我可以看到該值在表格中的位置是這樣的,游標在新行上:
在日志中列印的錯誤 :
出現的錯誤。ORA-06512: at "UPDATER.mypro", line 50
這是我的代碼 :
create or replace PROCEDURE mypro AS
O_ErrorCode 數字。
O_ErrorDesc VARCHAR2(100)。
l_clob2 VARCHAR2(32767)。
l_attach_text2 VARCHAR2 (32767)。
l_attach_text_h2 VARCHAR2 (32767)。
v_From VARCHAR2(280) := ' abc'。
v_Recipient VARCHAR2(280) := ' efggg';
v_Subject VARCHAR2(280) := 'entry & Details'。
v_Mail_Host VARCHAR2(230) := 'abcd';
v_Mail_Conn utl_smtp.Connection。
crlf VARCHAR2(200) := chr(13)||chr(10) 。
FC_SV_STATUS_DESC VARCHAR2(100) := 'open'。
CURSOR c2 IS
select FC_CA_RECORD_ID,to_char(FC_CA_INPUT_DATE , 'DD-MM-YY')作為FC_CA_INPUT_DATE,FC_CA_PAYER,FC_CA_AMOUNT,FC_CA_TYPE,FC_CA_PAYEE。 FC_CA_ADD_REMARKS,FC_CA_COMMENTS,FC_CA_ACC_NO,FC_CA_POLICY_NO,to_char(FC_CA_BRANCHCONF_DATE , 'DD-MM-YY')as FC_CA_BRANCHCONF_DATE,FC_CA_CONFIRMED_BY,to_char(FC_CA_SHEETUPDATE_DATE , 'DD-MM-YY')as FC_CA_SHEETUPDATE_DATE,to_char(FC_CA_MAILUPDATE_DATE , 'DD-MM-YY')as FC_CA_MAILUPDATE_DATE,to_char(FC_CA_UPLOAD_TIME , 'DD-MM-YY')作為FC_CA_UPLOAD_TIME。 FC_CA_UPLOAD_ID FROM Abcd where FC_CA_STATUS =1 ;
BEGIN
l_attach_text_h2 := ;BEGIN
'ID ,INPUT DATE ,PAYER ,AMOUNT ,TYPE ,PAYEE - SORT CODE & 銀行賬戶號碼,附加說明,評論,賬戶號碼,政策號碼,分行確認日期,確認人,表格更新日期,郵件更新日期,日期-時間,用戶ID,狀態'。
FOR employee_rec2 in c2
回圈
l_attach_text2 := '"'/span> ||
employee_rec2.FC_CA_RECORD_ID || '","' ||
employee_rec2.FC_CA_INPUT_DATE || ' ","' ||
employee_rec2.FC_CA_PAYER || '","' ||
employee_rec2.FC_CA_AMOUNT || '","' ||
employee_rec2.FC_CA_TYPE || '","' ||
employee_rec2.FC_CA_PAYEE || '","' ||
employee_rec2.FC_CA_ADD_REMARKS || ' ","' ||
employee_rec2.FC_CA_COMMENTS || ' ","' ||
employee_rec2.FC_CA_ACC_NO || '","' ||
employee_rec2.FC_CA_POLICY_NO || '","' ||
employee_rec2.FC_CA_BRANCHCONF_DATE || '","' ||
employee_rec2.FC_CA_CONFIRMED_BY || '","' ||
employee_rec2.FC_CA_SHEETUPDATE_DATE || '","' ||
employee_rec2.FC_CA_MAILUPDATE_DATE || '","' ||
employee_rec2.FC_CA_UPLOAD_TIME || '","' ||
employee_rec2.FC_CA_UPLOAD_ID || '","' ||
FC_SV_STATUS_DESC || '"' ||chr(13)。
l_clob2 := l_clob2||chr(10)||l_attach_text2;
END LOOP;
l_clob2 := l_attach_text_h2 ||chr(13)|| l_clob2;
DBMS_OUTPUT.put_line(' entries processing completed...')。
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25) 。
utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
utl_smtp.Mail(v_Mail_Conn, v_From);
utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
utl_smtp.Data(v_Mail_Conn,
'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24: mi:ss') || crlf ||
'From: ' || v_From || crlf ||
'Subject: '|| v_Subject || crlf ||
'To: ' || v_Recipient || Crlf ||
'MIME-Version: 1.0'|| crlf || --使用MIME郵件標準。
'Content-Type: multipart/mixed;'|| crlf ||
' boundary="-----SECBOUND"'|| crlf ||
crlf || ||
'-------SECBOUND'|| Crlf ||
'Content-Type: text/plain;'|| crlf ||
'Content-Transfer_Encoding: 7bit'|| crlf ||
crlf || ||
'Please find the following in the attachments :'|| crlf || -- Message body
'條目詳情'|| crlf ||
crlf || ||
'-------SECBOUND'|| Crlf ||
'Content-Type: text/plain;'|| crlf ||
' name="myfile.csv"'|| crlf ||
'Content-Transfer_Encoding: 8bit'|| crlf ||
'Content-Disposition: attachment;'|| crlf ||
' filename="myfile.csv"'|| crlf ||
crlf || ||
l_clob2 || crlf || --附件內容
crlf || -- 附件內容
'-------SECBOUND--' --結束MIME郵件。
);
utl_smtp.Quit(v_mail_conn)。
DBMS_OUTPUT.put_line('郵件發送完畢...')。
例外情況
WHEN Other THEN
O_ErrorCode := SQLCODE。
O_ErrorDesc := SUBSTR(SQLERRM, 1, 64) 。
DBMS_OUTPUT.put_line(O_ErrorCode)。
DBMS_OUTPUT.put_line(O_ErrorDesc)。
SYSTEM.intranet_utils.intranet_log_errors
(
'Exception',
SYSTEM.intranet_utils.intranet_get_errmsg
);
dba_utils.dba_log_batch ( 'Complete', 'Erred') 。
system.intranet_utils.INTRANET_LOG_ERRORS('process mypro',
system.intranet_utils.INTRANET_GET_ERRMSG, '錯誤在mypro')。)
END mypro。
誰能告訴我如何解決我的代碼中的這個問題,以及如何正確地在日志中列印錯誤?
CodePudding
之前作業但停止作業的原因很可能是你達到了dbms_output的緩沖值。默認的緩沖區大小是20000(查看docs),當超過這個值時,會拋出錯誤ORU-10027。我建議你洗掉這些呼叫--由于這個原因,任何生產代碼都不應該有對dbms_output的呼叫。
uj5u.com熱心網友回復:
包 "utl_smtp "中存盤程序 "data "的第二個引數是VARCHAR2型別,所以限制是32767位元組。
對于大資料,你必須使用
open_data
write_data
閱讀檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324997.html
標籤:

