【问题标题】:Before-insert trigger based on job categories基于作业类别的插入前触发器
【发布时间】:2021-08-31 02:44:36
【问题描述】:

美好的一天, 我正在尝试创建一个触发器,该触发器应根据用户的工作类别(医生/其他)将用户总数检索为所有已注册用户的两个参数,因此我开发了:

    CREATE OR REPLACE TRIGGER count_before_insert
    BEFORE INSERT
    ON REGISTRATION_FORM
    FOR EACH ROW

    DECLARE
    p_current_doctor_number varchar2(20);
    p_current_other_number varchar2(20);
    p_ann_id number;

   BEGIN

-- Count the existing trainees based on medical job category
SELECT COUNT(*) FROM REGISTRATION_FORM INTO p_current_doctor_number
WHERE JOB_CATEGORY = 'Medic'
AND ANNOUCMENT_ID = p_ann_id;

 -- Count the existing trainees based on other job category
 SELECT COUNT(*) FROM TRN_LS_REGISTRATION_FORM INTO p_current_other_number
 WHERE JOB_CATEGORY != 'Medic'
 AND ANNOUCMENT_ID = p_ann_id;

但我收到以下错误:

 Trigger COUNT_BEFORE_INSERT compiled

 LINE/COL  ERROR
--------- -------------------------------------------------------------
9/4       PL/SQL: SQL Statement ignored
9/50      PL/SQL: ORA-00933: SQL command not properly ended
14/4      PL/SQL: SQL Statement ignored
14/50     PL/SQL: ORA-00933: SQL command not properly ended
Errors: check compiler log

【问题讨论】:

  • 您评论说您将使用触发器将数据选择到页面项目中。这可以工作,但这不是一个好的做法。我建议为此使用存储过程或函数。
  • @Koen Lostrie 感谢您的建议,我尝试使用 plsql 函数直接从源中检索数据,但遗憾的是页面项目并未有意识地更新,任何建议表示赞赏并再次感谢。
  • 很难用这么少的信息给你建议。它应该始终使用 pl/sql 或 sql 作为源 - 如果您可以在 apex.oracle.com 上创建一个测试用例,或者创建一个关于此的新问题,我很乐意看看。应该避免触发 - 这将成为维护的噩梦,对于追随你的开发人员来说是一个完全的谜:)

标签: sql oracle plsql triggers oracle-apex


【解决方案1】:

SELECT - INTO - FROM,不是SELECT - FROM - INTO

CREATE OR REPLACE TRIGGER count_before_insert
   BEFORE INSERT
   ON REGISTRATION_FORM
   FOR EACH ROW

DECLARE
   p_current_doctor_number  VARCHAR2 (20);
   p_current_other_number   VARCHAR2 (20);
   p_ann_id                 NUMBER;
BEGIN
   -- Count the existing trainees based on medical job category
   SELECT COUNT (*)
     INTO p_current_doctor_number
     FROM REGISTRATION_FORM
    WHERE     JOB_CATEGORY = 'Medic'
          AND ANNOUCMENT_ID = p_ann_id;

   -- Count the existing trainees based on other job category
   SELECT COUNT (*)
     INTO p_current_other_number
     FROM TRN_LS_REGISTRATION_FORM
    WHERE     JOB_CATEGORY != 'Medic'
          AND ANNOUCMENT_ID = p_ann_id;
END;

现在,触发器没有做任何事情智能,所以我想你会在这里做更多的事情。

当心变异表错误(您不能从刚刚被修改的表中选择数据)。

另外,p_ann_id 是一个局部变量,当前为 NULL,因此这些选择不会返回任何内容。也许你打算使用

... and ANNOUCMENT_ID = :new.ANNOUCMENT_ID

【讨论】:

  • 再次感谢您一直以来的帮助和支持,我 100% 同意您的看法,但这些数据将被检索到两个页面项中,然后在 IF 语句中使用以检查当前用户是否达到最大值允许的用户数。再次感谢您的大力帮助
猜你喜欢
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
相关资源
最近更新 更多