oracle 无法创建跟踪新旧工资记录的触发器[已关闭]

cbwuti44  于 2023-04-29  发布在  Oracle
关注(0)|答案(1)|浏览(127)

**关闭。**这个问题是not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
4天前关闭。
Improve this question

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "STUDENT1.LOG_SALARY_INCREASE", line 2
ORA-04088: error during execution of trigger 'STUDENT1.LOG_SALARY_INCREASE'

LOGID        EMPLOYEEID     LOGDATE      NEW_SALARY
jvlzgdj9

jvlzgdj91#

你没注意到你做了什么吗?
变量被声明为CHAR(5),并且您试图将(至少)

LOG || 20230424 || 12

它的长度为13个字符。
LOG_ID放大到 * 更大 *。有多大?不知道,这取决于你的期望。序列号有问题,因为字符串的其余部分是固定的(LOGYYYYMMDD)。另外,LPAD到2个字符的长度是否足够?
如果我是你我会放下table用

  • log_id number,使其自动生成(i.e.标识列(如果您的数据库版本支持);或序列)
  • 使用date数据类型列表示插入日期(这是你已经拥有的log_date列)
CREATE TABLE emp_log
(
   log_id       NUMBER CONSTRAINT pk_log PRIMARY KEY,
   log_date     DATE,
   employeeid   CHAR (5) CONSTRAINT fk_log_emp REFERENCES employee (employeeid),
   old_salary   NUMBER,
   new_salary   NUMBER,
   action       VARCHAR2 (20)
);

CREATE SEQUENCE emp_log_seq;

CREATE OR REPLACE TRIGGER log_salary
   BEFORE UPDATE OF salary
   ON employee
   FOR EACH ROW
BEGIN
   INSERT INTO emp_log (log_id,
                        log_date,
                        employeeid,
                        old_salary,
                        new_salary,
                        action)
        VALUES (emp_log_seq.NEXTVAL,
                SYSDATE,
                :new.employeeid,
                :old.salary,
                :new.salary,
                'New salary');
END;
/

相关问题