使用 Begin - End 语句在 Oracle 脚本中激活和停用触发器

问题描述 投票:0回答:1

我需要在执行脚本中的某些请求之前停用触发器:

DECLARE
    CPM_ID PLS_INTEGER;
    CPM_ID_TO_DELETE PLS_INTEGER;
BEGIN
    BEGIN
        SELECT ID INTO CPM_ID_TO_DELETE FROM CPM_T WHERE TITLE LIKE '%My Contract%';
        DELETE CPM_HIST_T WHERE HIST_ID  = CPM_ID_TO_DELETE;
        -- Deactivate the trigger
        EXECUTE IMMEDIATE 'ALTER TRIGGER CPM_HIST_ID_TRIG DISABLE';
        DELETE CPM_T WHERE ID  = CPM_ID_TO_DELETE;
        -- Activate the trigger
        EXECUTE IMMEDIATE 'ALTER TRIGGER CPM_HIST_ID_TRIG ENABLE';
    EXCEPTION
        WHEN NO_DATA_FOUND
            THEN
                NULL;
    END;
    CPM_ID := CPM_ID_SEQ.nextval;
    Insert into CPM_T (ID,ORG_ID,TITLE) values (CPM_ID,'7257','My Contract');
END;

尽管如此,它不起作用,我收到此错误:“通常是 PL/SQL 编译错误 - ORA-06550”

显然我无法执行命令“ALTER.....”

你能帮我解决这个问题吗?

sql oracle triggers
1个回答
0
投票

“通常”是什么意思?有时,但并非总是如此?因为,您发布的代码看起来不错,并且不会为我的测试用例引发错误。

示例对象:

SQL> CREATE TABLE cpm_t
  2  (
  3     id       NUMBER,
  4     org_id   VARCHAR2 (20),
  5     title    VARCHAR2 (20)
  6  );

Table created.

SQL> CREATE TABLE cpm_hist_t
  2  (
  3     hist_id   NUMBER
  4  );

Table created.

SQL> CREATE OR REPLACE TRIGGER cpm_hist_id_trig
  2     BEFORE INSERT
  3     ON cpm_hist_t
  4     FOR EACH ROW
  5  BEGIN
  6     NULL;
  7  END;
  8  /

Trigger created.

SQL> CREATE SEQUENCE cpm_id_seq;

Sequence created.

您的代码(转换为过程;我没有更改任何内容):

SQL> CREATE OR REPLACE PROCEDURE p_test
  2  AS
  3     cpm_id            PLS_INTEGER;
  4     cpm_id_to_delete  PLS_INTEGER;
  5  BEGIN
  6     BEGIN
  7        SELECT id
  8          INTO cpm_id_to_delete
  9          FROM cpm_t
 10         WHERE title LIKE '%My Contract%';
 11
 12        DELETE cpm_hist_t
 13         WHERE hist_id = cpm_id_to_delete;
 14
 15        -- Deactivate the trigger
 16        EXECUTE IMMEDIATE 'ALTER TRIGGER CPM_HIST_ID_TRIG DISABLE';
 17
 18        DELETE cpm_t
 19         WHERE id = cpm_id_to_delete;
 20
 21        -- Activate the trigger
 22        EXECUTE IMMEDIATE 'ALTER TRIGGER CPM_HIST_ID_TRIG ENABLE';
 23     EXCEPTION
 24        WHEN NO_DATA_FOUND
 25        THEN
 26           NULL;
 27     END;
 28
 29     cpm_id := cpm_id_seq.NEXTVAL;
 30
 31     INSERT INTO cpm_t (id, org_id, title)
 32          VALUES (cpm_id, '7257', 'My Contract');
 33  END;
 34  /

Procedure created.

测试:

SQL> EXEC p_test;

PL/SQL procedure successfully completed.

SQL> SELECT * FROM cpm_t;

        ID ORG_ID               TITLE
---------- -------------------- --------------------
         1 7257                 My Contract

SQL> SELECT * FROM cpm_t;

        ID ORG_ID               TITLE
---------- -------------------- --------------------
         2 7257                 My Contract

SQL>

所以,这里没有任何问题。

您可以发布您自己的 SQL*Plus 会话来说明问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.