PL-SQL条件块

时间:2017-01-29 15:17:28

标签: oracle plsql

我在插入if语句时遇到错误,即如果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;

3 个答案:

答案 0 :(得分:3)

  

如果B列为NULL,我需要忽略特定行   数据已被预期&处理下一个其他记录

您可以使用以下方式。检查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;

答案 1 :(得分: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列,如果这是您的业务规则,那么这会变得有点混乱。 (请记住,错误消息可能不是英文,具体取决于呼叫者的语言设置。)

答案 2 :(得分:0)

我认为你可以使用更简单的insert子句(Yo甚至可以只使用insert而不是调用一个过程):

public string GetRowValue(int row)
{
    string result;
    if(!dictionary.TryGetValue(row, out result))
        result = "";
    return result;
}