2017-01-29 1 views
1

Я получаю сообщение об ошибке при вставке, если оператора блока, т.е., скажем, если B столбец NULL, я должен игнорировать конкретную строку, как некоторые данные ожидалось & toprocess следующий другой записи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

Вам не нужно назначать A-A1 и т. Д. Просто используйте A. Также посмотрите на обработку исключений в PL/SQL с предложением WHEN. –

+0

Какая ошибка вы получаете? – GurV

+0

Можете ли вы рассказать, как использовать обработку исключений в этом случае? – Ragav

ответ

3

говорит, что если B столбец NULL, я должен игнорировать конкретную строку, как некоторые данные ожидалось & toprocess следующей другой записи

Вы можете использовать нижеприведенный способ. Проверьте, нет ли 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 u plz сообщите мне, как провалить процедуру, если вообще «B» имеет нулевое значение? – Ragav

+0

@ Ragav. См. Обновленное сообщение. – XING

+0

Разумеется, OP хочет игнорировать случай, когда 'b' равно null, поэтому безусловный', когда другие тогда 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

Диапазон 'ORA', определенный для' pragma exception_init', находится между -20000 .. -20999. Глянь сюда. https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm # BABGIIBI – XING

+0

@XING, вы можете подумать о 'raise_application_error'. В моем примере мне нужно было связать свое пользовательское исключение 'обязательный_value_missing' с' ORA-01400: не может вставить NULL в ... ', следовательно -1400. –

0

Я думаю, вы можете использовать более простое предложение insert (Yo может даже использовать только вставку вместо вызова процедуры) :

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;