有人可以帮我修复错误 pls-00049 吗?
Posted
技术标签:
【中文标题】有人可以帮我修复错误 pls-00049 吗?【英文标题】:Can someone help me to fix an error pls-00049? 【发布时间】:2021-04-08 09:53:56 【问题描述】:我为我的 Oracle 任务创建了一个触发器,但出现了一些错误,我正在尝试解决但不知道如何解决。我正在寻找修复我的错误,但我没有找到有用的解决方案 请问有人可以帮我做吗?
这是我的代码:
create table sourcetablename_log (
id number,
operation_date date,
old_username varchar2(20),
new_username varchar2(20),
old_first_name varchar2(20),
new_first_name varchar2(20),
old_last_name varchar2(20),
new_last_name varchar2(20),
action varchar2(20),
author varchar2(20)
);
create or replace trigger src_log
before insert or delete or update on sourcetablename_log
for each row
begin
if inserting then
insert into sourcetablename_log(id, operation_date, new_username, new_firstname, new_lastname)
values (:new.id, sysdate, :new.username, :new.firstname, :new.lastname);
elsif updating then
insert into sourcetablename_log(id, operation_date, old_username, new_username, old_firstname, new_firstname, old_lastname, new_lastname)
values (:new.id, sysdate, :old.username, :new.username, :old.firstname, :new.firstname, :old.lastname, :new.lastname);
elsif deleting then
insert into sourcetablename_log(id, operation_date, old_username, new_username, old_firstname, new_firstname, old_lastname, new_lastname)
values (:new.id, sysdate, :old.username, :new.username, :old.firstname, :new.firstname, :old.lastname, :new.lastname);
end if;
end src_log;
这是一个错误:
LINE/COL ERROR
--------- -------------------------------------------------------------
4/27 PLS-00049: bad bind variable 'NEW.USERNAME'
4/42 PLS-00049: bad bind variable 'NEW.FIRSTNAME'
4/58 PLS-00049: bad bind variable 'NEW.LASTNAME'
7/27 PLS-00049: bad bind variable 'OLD.USERNAME'
7/42 PLS-00049: bad bind variable 'NEW.USERNAME'
7/57 PLS-00049: bad bind variable 'OLD.FIRSTNAME'
7/73 PLS-00049: bad bind variable 'NEW.FIRSTNAME'
7/89 PLS-00049: bad bind variable 'OLD.LASTNAME'
7/104 PLS-00049: bad bind variable 'NEW.LASTNAME'
10/27 PLS-00049: bad bind variable 'OLD.USERNAME'
10/42 PLS-00049: bad bind variable 'NEW.USERNAME'
10/57 PLS-00049: bad bind variable 'OLD.FIRSTNAME'
10/73 PLS-00049: bad bind variable 'NEW.FIRSTNAME'
10/89 PLS-00049: bad bind variable 'OLD.LASTNAME'
10/104 PLS-00049: bad bind variable 'NEW.LASTNAME'
Errors: check compiler log
我的问题是:
自动创建日志表并与之关联触发器 A 创建一个存储过程,该过程创建一个 LOGGING 表,其中包含 OLD 值和 NEW 值的相应列,ACTION 列,应按 ACTION 类型和用户名填写(作者) 示例:您有一个用户表 USER,其中包含下一列:
-
用户名 VARCHAR
FIRST_NAME VARCHAR
LAST_NAME VARCHAR
您的过程应该生成一个名为“SOURCETABLENAME”_LOG 的新表 - 在这种情况下 - USER_LOG 和下一个列:
-
ID NUMBER [或 OPERATION_ID NUMBER]
OPERATION_DATE 日期
OLD_USERNAME VARCHAR
NEW_USERNAME VARCHAR
OLD_FIRST_NAME VARCHAR
NEW_FIRST_NAME VARCHAR
OLD_LAST_NAME VARCHAR
NEW_LAST_NAME VARCHAR
ACTION VARCHAR
作者 VARCHAR**
【问题讨论】:
我会假设您还没有显示另一个表sourcetable
。我希望您的意思是定义在修改sourcetable
以将数据插入sourcetable_log
时触发的触发器。您已经在sourcetable_log
上定义了触发器,但您引用了username
和lastname
等sourcetable_log
中不存在的列。我假设它们存在于sourcetable
。
您确定要触发on sourcetablename_log
吗?当它插入该表时,它是否应该在其他表上,例如on sourcetablename
?
我没有其他桌子。我应该创建它吗?
"你有一个表 USER" - 所以你的触发器应该是 on user
? (除了user
是保留字...)听起来这应该是一个过程,它采用现有表的名称并根据该表中的列创建日志表和触发器。在示例中,日志表应称为user_log
。您似乎错过了任务的几个步骤。我猜你目前正在学习动态 SQL?
我以用户身份创建了表 sourcetablename,但仍然出现这些错误。
【参考方案1】:
如果列名是例如new_username
,那么你会使用:new.new_username
,而不仅仅是:new.username
。
所有其他列也是如此。
例如:
insert into sourcetablename_log(id, operation_date, new_username, new_firstname, new_lastname)
values (:new.id, sysdate, :new.new_username, :new.new_firstname, :new.new_lastname);
【讨论】:
这些列名似乎是正确的,而触发器表名是错误的——因为它插入到定义触发器的同一个表中 对,@Alex,没有注意到这一点。看起来ON SOURCETABLENAME_LOG
是错误的,应该是其他表。
所以,据我所知,我需要创建新表或什么?
您正在将“某个表”上的更改记录到 SOURCETABLENAME_LOG 中。是哪张桌子?有一个日志表和一个基于同一个日志表的触发器是没有用的。您没有 SOURCETABLENAME 本身吗?
哦,好吧,我没有。谢谢。以上是关于有人可以帮我修复错误 pls-00049 吗?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 错误 PLS-00049:错误的绑定变量 'NEW.NOOFCUSTOMERS'
条件 old 不等于 new 的 Oracle 触发器以错误 PLS-00049、PL/SQL: ORA-00933 结束