如何在 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

现在,我编写了一个存储过程来检查新插入的行 brandIdActivityCode 是否已经存在于 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 子句将无法按预期执行。 只需更改参数的名称。