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