【发布时间】:2015-06-18 15:36:34
【问题描述】:
我有一个 SQL 表,其中特定的 record ID(主键)可能有多个 Contact IDs。我想创建一个触发器,每次添加新行时,它都会检查record ID 是否存在,如果存在,它将新的Contact ID 添加到当前Contact ID 字段中,用逗号分隔(到本质上是创建一个列表)。因此,对于多个Contact IDs,该字段可能变为:
Contact123, Contact456, Contact999
为此,我编写了以下触发器:
CREATE OR REPLACE
TRIGGER "TEST_INSERT" BEFORE
INSERT ON "TEST_INSERT" REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE REC_COUNT INTEGER;
BEGIN
SELECT COUNT(*)
INTO REC_COUNT
FROM TEST_INSERT
WHERE RECORDID = :NEW.RECORDID;
IF REC_COUNT > 0 THEN
CONTACTID + ', ' + :NEW.CONTACTID AS CONTACTID; --This is the line where I'm getting the error
END IF;
END;
+ 符号和 AS 操作出现错误。我是不是完全走错了路?
谢谢
【问题讨论】:
-
Oracle 字符串通常使用
||运算符而不是+连接 -
The concatenation operator is ||;您还需要将连接的字符串分配给某些东西。不过,你在做什么并没有真正的意义。如果您插入一个新联系人,您想将该新值更改为旧值和新值吗?或者您想将插入更改为更新,以便您只有一行,从而破坏规范化?你几乎肯定不想这样做,如果你这样做,你就不能使用触发器。你提到了一个PK;联系人在子表中吗?
-
@tvm:这与 Oracle 无关。这是 SQL 标准中定义的运算符。
-
感谢您的回复。我用 + 和 || 都试过了它们都出现相同的 PL-00103 错误。亚历克斯,我正在尝试将
CONTACTID的新值添加到与RECORDID匹配的行上。我想最终得到一个联系人 ID 列表,而不是为每个单独的行。例如,在 Javascript 中,我会以contactId=contactId+", "+newContactId的形式执行此操作,这就是我要复制的内容。 -
如果要将新值附加到现有行中的值,则需要更新该行,而不是插入新行。您可以使用合并语句“插入”,但不能使用触发器 - 首先使用合并而不是插入。不过,我真的会质疑你的方法;您正在对数据进行非规范化 - 为什么不为每个 recordid/contactid 组合创建一个单独的表格?当您想更改或删除联系人时,您会怎么做?
标签: sql triggers oracle-sqldeveloper