2017-01-29 30 views
1

如果塊語句即同時插入我得到的錯誤,說當B柱是空的,我需要忽略特定行一些數據預期&麥克羅公司一直供應在未來其他記錄PL-SQL條件塊

CREATE OR REPLACE PROCEDURE Sample(
A  IN DATE, 
B  IN VARCHAR2, 
C  IN NUMBER, 
D  IN NUMBER) 
IS 
A1  DATE; 
B1  VARCHAR2(10); 
C1  NUMBER(28,12); 
D1  NUMBER(28,12); 

BEGIN 
A1  := A; 
B1  := B; 
C1  := C; 
D1  := D; 
INSERT 
INTO Sample1 VALUES 
(
    A1, 
    B1, 
    C1, 
    D1 
); 
END; 
+2

您不需要將A1分配給A1等。只需使用A.還可以看看PL/SQL中的異常處理,以及WHEN子句。 –

+0

你有什麼錯誤? – GurV

+0

請問在這種情況下如何使用異常處理? – Ragav

回答

3

說,當B柱是空的,我需要忽略特定行一些 數據預期&麥克羅公司一直供應在未來其他記錄

您可以使用下面的方法。檢查B是否爲空,然後只插入記錄。

CREATE OR REPLACE PROCEDURE SAMPLE (
    a IN DATE 
    ,b IN VARCHAR2 
    ,c IN NUMBER 
    ,d IN NUMBER 
    ) 
    IS 

    abc EXCEPTION; 
    PRAGMA EXCEPTION_INIT(abc,-20001); 

BEGIN 
    IF b IS NOT NULL 
    THEN 
    INSERT INTO sample1 
     VALUES (a 
       ,b 
       ,c 
       ,d 
       ); 
    ELSE 
    Raise abc; 
    END IF; 
    commit; 

    Exception 
     ---If you want to show some user defined error you can raise here. 
     WHEN abc then 
     dbms_output.put_line('Ora:'||sqlcode||', B is Null.'); 

     When others then 
     dbms_output.put_line('Error');   

    END; 
+0

感謝您的評論xing..CouldüPLZ讓我知道,如果在所有'B'有空值如何失敗的程序? – Ragav

+0

@Ragav。查看更新的帖子。 – XING

+0

當然OP只想忽略'b'爲空的情況,所以無條件的'when others then dbms_output'是過度的。另外''sqlcode'在這裏沒有幫助,因爲它只是反映了你之前提出的幾行用戶定義的異常。另外我覺得我們應該鼓勵他使用格式化... –

0

當你說你想「忽略特定行」你的意思是哪裏b是空的程序的任何呼叫?如果是這樣,只是一個if條件檢查:

create or replace procedure demo 
    (a in date 
    , b in varchar2 
    , c in number 
    , d in number) 
as 
begin 
    if b is null then 
     your_logging_package.msg('Ignored insert request for a='||a||', b=null, c='||c||', d='||d); 
    else 
     insert into sample1 (col_a, col_b, col_c, col_d) 
     values (a, b, c, d); 
    end if;  
end demo; 

不然(因爲異常處理中提到的),你可以嘗試插入不管再處理異常,如果它失敗:

create or replace procedure demo 
    (a in date 
    , b in varchar2 
    , c in number 
    , d in number) 
as 
    mandatory_value_missing exception; 
    pragma exception_init(mandatory_value_missing, -1400); 
begin 
    insert into sample1 (col_a, col_b, col_c, col_d) 
    values (a, b, c, d); 
exception 
    when mandatory_value_missing then 
     if sqlerrm like '%"SAMPLE1"."COL_B"%' then 
      your_logging_package.msg('Ignored insert request for a='||a||', b='||b||', c='||c||', d='||d); 
     end if;  
end demo; 

然而,

  1. 這可能是過於複雜,如果你已經知道你想跳過行,其中b爲空, 和
  2. 您必須檢查錯誤消息的文本,以確保它只適用於列B,如果這是您的業務規則,所以這有點混亂。 (請注意,錯誤信息可能不是英文,具體取決於調用者的語言設置。)
+0

定義爲'pragma exception_init'的'ORA'範圍在-20000 .. -20999之間。看這裏。 https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors。htm#BABGIIBI – XING

+0

@XING,你可能會想'raise_application_error'。在我的例子中,我需要將我自定義的'mandatory_value_missing'異常與'ORA-01400:不能將NULL插入...',因此-1400。 –

0

我認爲你可以使用更簡單的插入子句(喲甚至可以只使用插入而不是調用過程) :

CREATE OR REPLACE FUNCTION SAMPLE (--I Changed from procedure to function to manage exceptions and it is useful if you want to monitor the job 
            A IN DATE, 
            B IN VARCHAR2, 
            C IN NUMBER, 
            D IN NUMBER 
           ) 
    RETURN NUMBER 
IS 
BEGIN 
    INSERT INTO AAA 
     SELECT A, B, C, D 
     FROM DUAL 
     WHERE B IS NOT NULL; 

    RETURN SQL%ROWCOUNT;--1 is for OK and 0 is when b is NULL 
EXCEPTION 
    WHEN OTHERS --it is only if you have problems in destination table(space, constraints & etc.) 
    THEN 
     RETURN -1; 
END;