Oracle PL-SQL条件块

Oracle PL-SQL条件块,oracle,plsql,Oracle,Plsql,插入if-block语句时出错,例如,如果B列为NULL,我需要忽略特定行,因为需要一些数据&处理下一条其他记录 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,1

插入if-block语句时出错,例如,如果B列为NULL,我需要忽略特定行,因为需要一些数据&处理下一条其他记录

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;
假设B列为NULL,我需要忽略特定的行 需要数据&t处理下一条其他记录

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;
你可以用下面的方法。检查
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;
当您说要“忽略特定行”时,您是指对
b
为空的过程的任何调用吗?如果是,只需使用
条件检查即可:

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;
但是,

  • 如果您已经知道要跳过
    b
    为空的行,那么这可能过于复杂了, 及
  • 您必须检查错误消息的文本,以确保它只适用于B列,如果这是您的业务规则,那么这就有点混乱了。(请记住,错误消息可能不是英文的,具体取决于调用者的语言设置。)

  • 我认为您可以使用更简单的insert子句(您甚至可以只使用insert而不调用过程):


    您不需要将A分配给A1等。只需使用A。还可以使用WHEN子句查看PL/SQL中的异常处理。您会遇到什么错误?您能告诉我在这种情况下如何使用异常处理吗?@Ragav尝试一下,如果它不起作用,请发布代码。谢谢您的注释邢..请告诉我,如果“B”有空值,如何使过程失败?当然OP只想忽略
    B
    为空的情况,因此当其他dbms_输出时,无条件
    是多余的。另外,
    sqlcode
    在这里也没有帮助,因为它只会反映您前面几行提出的用户定义的异常。另外,我觉得我们应该鼓励他使用格式…@WilliamRobertson。如果你阅读了所有的评论,你会发现OP的第一个问题是如何使用异常处理,我的回答显示了当其他时的
    ,后来他要求将b处理为空,因为答案是由
    引发异常给出的。我想说的是,您必须将您的格式建议放在OP问题的评论部分。感谢您的评论为
    pragma exception_init
    定义的
    ORA
    范围在-20000之间-20999 . 看这里@XING,您可能正在考虑
    引发应用程序错误
    。在我的示例中,我需要将我的自定义
    强制\u值\u缺失
    异常与
    ORA-01400:无法将NULL插入到…
    ,因此为-1400。