SQL触发器没有编译

时间:2014-05-08 09:34:09

标签: sql oracle plsql oracle-sqldeveloper triggers

我使用Oracle sqldeveloper 3.2.20和oracleXE112作为我的数据库。我试图创建一个触发器,但不断收到此错误

Error(2,13): PLS-00357: Table,View Or Sequence reference 'SPRAVCA.REGION_ID_REGION' not allowed in this context

我有表SPRAVCA,其外键REGION_ID_REGION链接到表REGION中的主键ID_REGION。我有属性pocet_sp,它表示分配给特定REGION实体的SPRAVCA实体的数量。 我的脚本看起来像这样

CREATE OR REPLACE TRIGGER calc_poc_sp
AFTER INSERT OR UPDATE
ON SPRAVCA
FOR EACH ROW
BEGIN
IF (SPRAVCA.REGION_ID_REGION) = (REGION.ID_REGION) THEN
NEW.POCET_SP := OLD.POCET_SP + 1;
END IF;
END calc_poc_sp;

我想创建一个触发器,如果​​将创建任何具有匹配的foregin键的SPRAVCA,它将自动增加REGION实体中的pocet_sp。非常感谢提前!

1 个答案:

答案 0 :(得分:0)

在oracle中:

IF (SPRAVCA.REGION_ID_REGION) = (REGION.ID_REGION) THEN

不起作用。这不像java或任何其他编程语言。这里的序列对象是一个对象,它有两个可以访问该值的方法。 CURRVAL和NEXT VAL。

NEXTVAL将递增您的当前值并检索递增的值。但CURRVAL将退出目前的价值。

不幸的是。我已经体验到CURRVAL通常不起作用,直到NEXTVAL没有在同一个Connection会话中调用序列。

请指定用例,因为您需要检查序列的当前值。

仍有更正版本:

CREATE OR REPLACE TRIGGER calc_poc_sp
AFTER INSERT OR UPDATE
ON SPRAVCA
FOR EACH ROW
DECLARE
VAL_CHECK REGION.ID_REGION%TYPE;
CURSOR REGION IS SELECT * FROM REGION;
BEGIN
--
--    SELECT SPRAVCA.REGION_ID_REGION.CURRVAL INTO VAL_CHECK FROM DUAL;

SELECT REGION_ID_REGION INTO VAL_CHECK FROM SPRAVCA <ADD YOUR WHERE CLAUSE SO THAT ONLY 1 ROW IS RETURNED>;
--I have added a loop statement so that u can iterate through all the values of the region table. If you dont want to loop then add a where clause where you see the REGION cursor being defined.
FOR 1 IN REGION LOOP
IF (VAL_CHECK) = (REGION.ID_REGION) THEN
--
NEW.POCET_SP := OLD.POCET_SP + 1;
--
END IF;
END LOOP;
END calc_poc_sp;

请查看语法,因为我现在没有数据库访问权限。

还有一个问题:

您在哪里定义了触发器中的REGION。这是一个错误,因为你没有定义它。