我試圖在 SQLPLUS 中處理自定義例外,我有兩個存盤程序,我有第二個存盤程序呼叫第一個。
在第一個存盤程序中,我有一個 CASE 檢查表中行的 data_types,如果型別不是 CHAR、VARCHAR2、DATE 或 NUMBER,則它應該顯示客戶 EXCEPTION 的 Data_Type 和 RAISE_APPLICATION_ERROR我在呼叫第一個程式的第二個程式中宣告的。
這是我來自第二個存盤程序的代碼:
CASE CurrentRow.Data_Type
WHEN 'CHAR' THEN
wDataType := (CurrentRow.Data_Type || '(' || CurrentRow.CHAR_LENGTH || ')');
WHEN 'VARCHAR2' THEN
wDataType := (CurrentRow.Data_Type || '(' || CurrentRow.CHAR_LENGTH || ')');
WHEN 'DATE' THEN
wDataType := (CurrentRow.Data_Type);
WHEN 'NUMBER' THEN
wDataType := (CurrentRow.Data_Type || '(' || CurrentRow.Data_Precision || ',' || CurrentRow.Data_Scale || ')');
ELSE
wDataType := (CurrentRow.Data_Type);
RAISE_APPLICATION_ERROR(-20100, '*** Unknown Data Type ' || CurrentRow.Data_Type || ' ***');
END CASE;
現在我在我的第二個存盤程序中有一個嵌套塊,但是無論我把它放在哪里或試著把它放在周圍,一旦出現錯誤?它停止執行我的其余代碼,這就是我的問題。我有一種感覺,我可能在我的第二個存盤程序中沒有正確地執行我的嵌套塊...
下面是呼叫我的第一個存盤程序的第二個存盤程序的代碼:
CREATE OR REPLACE PROCEDURE Get_Tables
/*
* Sept 26th, 2021
* To process each table in the schema, and output table-related lines.
*/
AS
CURSOR TablesSelected IS
SELECT Table_Name
FROM User_Tables
ORDER BY Table_Name ASC;
CurrentRow User_Tables%ROWTYPE;
dt DATE := sysdate;
wVersionNumber VARCHAR(4) := 'V3.0';
wLeftPadTableName VARCHAR(100);
wLengthOfStatement VARCHAR(100);
BEGIN
DBMS_OUTPUT.PUT_LINE( '---- Oracle Catalog Extract Utility ' || wVersionNumber || ' ----' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- Run on '|| TO_CHAR(dt,'Mon DD,YYYY','NLS_DATE_LANGUAGE=English')||' at '||TO_CHAR(dt,'HH24:MI') );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- S T A R T I N G T A B L E D R O P S' );
DBMS_OUTPUT.PUT_LINE( '----' );
FOR CurrentRow IN TablesSelected LOOP
DBMS_OUTPUT.PUT_LINE( 'DROP TABLE ' || CurrentRow.Table_Name);
END LOOP;
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- T A B L E D R O P S C O M P L E T E D' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- S T A R T I N G T A B L E C R E A T E' );
DBMS_OUTPUT.PUT_LINE( '----' );
/*
* Nested block starts
* LOOP gets all the tables in the database and aligns them up.
*/
DECLARE
INVALID_COLUMN_EXCEPTION EXCEPTION;
PRAGMA EXCEPTION_INIT(INVALID_COLUMN_EXCEPTION, -20100);
BEGIN
FOR CurrentRow IN TablesSelected LOOP
wLengthOfStatement := LENGTH('CREATE TABLE' || CurrentRow.Table_Name || ' ' || '); -- ');
wLeftPadTableName := LPAD('); -- ', wLengthOfStatement, ' ');
DBMS_OUTPUT.PUT_LINE( '-- Start extracting table ' || CurrentRow.Table_Name);
DBMS_OUTPUT.PUT_LINE('CREATE TABLE ' || CurrentRow.Table_Name || '( ');
Extract_Columns(CurrentRow.Table_Name);
DBMS_OUTPUT.PUT_LINE(wLeftPadTableName || 'END of table ' || CurrentRow.Table_Name || ' creation');
DBMS_OUTPUT.PUT_LINE( '--' );
DBMS_OUTPUT.PUT_LINE( '--' );
END LOOP;
EXCEPTION
WHEN INVALID_COLUMN_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('================================================================================');
DBMS_OUTPUT.PUT_LINE('== EXCEPTION ' || SQLCODE || ' Raised - ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('== Unable to complete table generation for ' || CurrentRow.Table_Name);
DBMS_OUTPUT.PUT_LINE('================================================================================');
END;
/*
* Nested block ends
*/
DBMS_OUTPUT.PUT_LINE( '---- T A B L E C R E A T E C O M P L E T E D' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- Oracle Catalog Extract Utility ' || wVersionNumber || ' ----' );
DBMS_OUTPUT.PUT_LINE( '---- Run Completed on '||TO_CHAR(dt,'Mon DD,YYYY','NLS_DATE_LANGUAGE=English')||' at '||TO_CHAR(dt,'HH24:MI') );
END;
/
當我列印出我的報告時……我引發的 ERROR 會終止回圈其余部分的執行,因此它不會抓取其他表及其行。

如果任何 SQL 向導可以幫助我隔離我的問題,我將不勝感激。我需要知道我可以做些什么來使我的 LOOP 和存盤程序繼續執行,即使在引發例外之后也是如此。
uj5u.com熱心網友回復:
如果您希望 FOR 回圈在 EXCEPTION 發生后繼續,請將嵌套塊放在 FOR 回圈內。
(您也不需要為自定義 EXCEPTION 單獨宣告。)
CREATE OR REPLACE PROCEDURE Get_Tables
AS
CURSOR TablesSelected IS
SELECT Table_Name
FROM User_Tables
ORDER BY Table_Name ASC;
CurrentRow User_Tables%ROWTYPE;
dt DATE := sysdate;
wVersionNumber VARCHAR(4) := 'V3.0';
wLeftPadTableName VARCHAR(100);
wLengthOfStatement VARCHAR(100);
INVALID_COLUMN_EXCEPTION EXCEPTION;
PRAGMA EXCEPTION_INIT(INVALID_COLUMN_EXCEPTION, -20100);
BEGIN
DBMS_OUTPUT.PUT_LINE( '---- Oracle Catalog Extract Utility ' || wVersionNumber || ' ----' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- Run on '|| TO_CHAR(dt,'Mon DD,YYYY','NLS_DATE_LANGUAGE=English')||' at '||TO_CHAR(dt,'HH24:MI') );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- S T A R T I N G T A B L E D R O P S' );
DBMS_OUTPUT.PUT_LINE( '----' );
FOR CurrentRow IN TablesSelected LOOP
DBMS_OUTPUT.PUT_LINE( 'DROP TABLE ' || CurrentRow.Table_Name);
END LOOP;
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- T A B L E D R O P S C O M P L E T E D' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- S T A R T I N G T A B L E C R E A T E' );
DBMS_OUTPUT.PUT_LINE( '----' );
FOR CurrentRow IN TablesSelected LOOP
wLengthOfStatement := LENGTH('CREATE TABLE' || CurrentRow.Table_Name || ' ' || '); -- ');
wLeftPadTableName := LPAD('); -- ', wLengthOfStatement, ' ');
DBMS_OUTPUT.PUT_LINE( '-- Start extracting table ' || CurrentRow.Table_Name);
DBMS_OUTPUT.PUT_LINE('CREATE TABLE ' || CurrentRow.Table_Name || '( ');
/*
* Nested block starts
*/
BEGIN
Extract_Columns(CurrentRow.Table_Name);
EXCEPTION
WHEN INVALID_COLUMN_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('================================================================================');
DBMS_OUTPUT.PUT_LINE('== EXCEPTION ' || SQLCODE || ' Raised - ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('== Unable to complete table generation for ' || CurrentRow.Table_Name);
DBMS_OUTPUT.PUT_LINE('================================================================================');
END;
/*
* Nested block ends
*/
DBMS_OUTPUT.PUT_LINE(wLeftPadTableName || 'END of table ' || CurrentRow.Table_Name || ' creation');
DBMS_OUTPUT.PUT_LINE( '--' );
DBMS_OUTPUT.PUT_LINE( '--' );
END LOOP;
DBMS_OUTPUT.PUT_LINE( '---- T A B L E C R E A T E C O M P L E T E D' );
DBMS_OUTPUT.PUT_LINE( '----' );
DBMS_OUTPUT.PUT_LINE( '---- Oracle Catalog Extract Utility ' || wVersionNumber || ' ----' );
DBMS_OUTPUT.PUT_LINE( '---- Run Completed on '||TO_CHAR(dt,'Mon DD,YYYY','NLS_DATE_LANGUAGE=English')||' at '||TO_CHAR(dt,'HH24:MI') );
END;
/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324106.html
