如何在 PLSQL 中进行条件检查
How to do condition check in PLSQL
我有一个 table 如下所示:
CREATE TABLE BRANDACTIVITYTYPE(
BRANDID VARCHAR2(50),
ACTIVITYCODE VARCHAR2(10),
CONSTRAINT PK_BRANDACTY primary key(BRANDID, ACTIVITYCODE),
CONSTRAINT FK_BRAND_BRANDACTY FOREIGN KEY (BRANDID) REFERENCES BRAND(BID) ON DELETE CASCADE,
CONSTRAINT FK_ACTIVITYCODE_BRANDACTY FOREIGN KEY (ACTIVITYCODE) REFERENCES ACTIVITYTYPE(ACTIVITYCODE) ON DELETE CASCADE
);
table 的当前数据如下:
BRANDID
ACTIVITYCODE
b01
A01
b01
A02
b02
A01
b02
A02
现在,我编写了一个存储过程来检查新插入的行 brandId
和 ActivityCode
是否已经存在于 BRANDACTIVITYTYPE table 中。如果存在,则无需将元组插入另一个 table.
create or replace PROCEDURE add_re_rule
(
brandId IN VARCHAR2,
activityCode IN VARCHAR2,
points IN NUMBER,
ret OUT INT
)
AS
SAMERULECOUNT INT;
ACTYPECOUNT INT;
BEGIN
SELECT COUNT(BRANDID) INTO ACTYPECOUNT FROM BRANDACTIVITYTYPE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
SELECT COUNT(BRANDID) INTO SAMERULECOUNT FROM RERULE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
Dbms_Output.Put_Line(ACTYPECOUNT);
IF SAMERULECOUNT > 0 THEN
ret := 0;
ELSIF ACTYPECOUNT = 0 THEN
ret := 2;
ELSE
-- Insert into rerule table
INSERT INTO RERULE(BRANDID, ACTIVITYCODE, POINTS, VERSIONNO) values (brandId, activityCode, points, 1);
ret := 1;
END IF;
END;
/
当我运行下面查询时,return0是正确的。
SELECT COUNT(BRANDID) FROM BRANDACTIVITYTYPE WHERE BRANDID = 'b01' AND ACTIVITYCODE = 'A05';
但是,当我 运行 存储过程时,它 returns 4 表示 BRANDACTIVITYTYPE table 的所有元组计数,这是错误的并进入 else 条件。它应该 return 0.
SET SERVEROUTPUT ON;
DECLARE ret int;
BEGIN
add_re_rule('b01', 'A05', 60, ret);
END;
Error starting at line : 32 in command -
DECLARE ret int;
BEGIN
add_re_rule('b01', 'AOS', 60, ret);
END;
Error report -
ORA-02291: integrity constraint (C##SCOTT.FK_ACTIVITYCODE_RE) violated - parent key not found
ORA-06512: at "C##SCOIT.ADD RE RULE", line 23
ORA-06512: at line 3
02291. 00000 - "integrity constraint (%s.%s) viclated - parent key not found"
*Cause: A foreign key value has no matching primary key value.
*Action: Delete the foreign key or add a matching primary key.
我错过了什么吗?
您对过程的参数和列名使用了相同的名称,因此 SELECT COUNT(BRANDID) INTO SAMERULECOUNT FROM RERULE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
的 where 子句将无法按预期执行。
只需更改参数的名称。
我有一个 table 如下所示:
CREATE TABLE BRANDACTIVITYTYPE(
BRANDID VARCHAR2(50),
ACTIVITYCODE VARCHAR2(10),
CONSTRAINT PK_BRANDACTY primary key(BRANDID, ACTIVITYCODE),
CONSTRAINT FK_BRAND_BRANDACTY FOREIGN KEY (BRANDID) REFERENCES BRAND(BID) ON DELETE CASCADE,
CONSTRAINT FK_ACTIVITYCODE_BRANDACTY FOREIGN KEY (ACTIVITYCODE) REFERENCES ACTIVITYTYPE(ACTIVITYCODE) ON DELETE CASCADE
);
table 的当前数据如下:
BRANDID | ACTIVITYCODE |
---|---|
b01 | A01 |
b01 | A02 |
b02 | A01 |
b02 | A02 |
现在,我编写了一个存储过程来检查新插入的行 brandId
和 ActivityCode
是否已经存在于 BRANDACTIVITYTYPE table 中。如果存在,则无需将元组插入另一个 table.
create or replace PROCEDURE add_re_rule
(
brandId IN VARCHAR2,
activityCode IN VARCHAR2,
points IN NUMBER,
ret OUT INT
)
AS
SAMERULECOUNT INT;
ACTYPECOUNT INT;
BEGIN
SELECT COUNT(BRANDID) INTO ACTYPECOUNT FROM BRANDACTIVITYTYPE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
SELECT COUNT(BRANDID) INTO SAMERULECOUNT FROM RERULE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
Dbms_Output.Put_Line(ACTYPECOUNT);
IF SAMERULECOUNT > 0 THEN
ret := 0;
ELSIF ACTYPECOUNT = 0 THEN
ret := 2;
ELSE
-- Insert into rerule table
INSERT INTO RERULE(BRANDID, ACTIVITYCODE, POINTS, VERSIONNO) values (brandId, activityCode, points, 1);
ret := 1;
END IF;
END;
/
当我运行下面查询时,return0是正确的。
SELECT COUNT(BRANDID) FROM BRANDACTIVITYTYPE WHERE BRANDID = 'b01' AND ACTIVITYCODE = 'A05';
但是,当我 运行 存储过程时,它 returns 4 表示 BRANDACTIVITYTYPE table 的所有元组计数,这是错误的并进入 else 条件。它应该 return 0.
SET SERVEROUTPUT ON;
DECLARE ret int;
BEGIN
add_re_rule('b01', 'A05', 60, ret);
END;
Error starting at line : 32 in command -
DECLARE ret int;
BEGIN
add_re_rule('b01', 'AOS', 60, ret);
END;
Error report -
ORA-02291: integrity constraint (C##SCOTT.FK_ACTIVITYCODE_RE) violated - parent key not found
ORA-06512: at "C##SCOIT.ADD RE RULE", line 23
ORA-06512: at line 3
02291. 00000 - "integrity constraint (%s.%s) viclated - parent key not found"
*Cause: A foreign key value has no matching primary key value.
*Action: Delete the foreign key or add a matching primary key.
我错过了什么吗?
您对过程的参数和列名使用了相同的名称,因此 SELECT COUNT(BRANDID) INTO SAMERULECOUNT FROM RERULE WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode;
的 where 子句将无法按预期执行。
只需更改参数的名称。