Oracle PLS-00049:坏绑定变量“NEW.NEW\u SKILL\u DESC”
当我运行触发器时,PLS-00049:坏绑定变量“NEW.NEW\u SKILL\u DESC”出现问题。问题出现在:新建部分。这是我第一次审核数据库查询Oracle PLS-00049:坏绑定变量“NEW.NEW\u SKILL\u DESC”,oracle,triggers,bind,Oracle,Triggers,Bind,当我运行触发器时,PLS-00049:坏绑定变量“NEW.NEW\u SKILL\u DESC”出现问题。问题出现在:新建部分。这是我第一次审核数据库查询 CREATE OR REPLACE TRIGGER lds_skill_trig BEFORE INSERT OR DELETE OR UPDATE ON LDS_SKILL FOR EACH ROW ENABLE DECLARE v_user VARCHAR2(30); v_date VARCHAR2(30); BEGIN
CREATE OR REPLACE TRIGGER lds_skill_trig
BEFORE INSERT OR DELETE OR UPDATE ON LDS_SKILL
FOR EACH ROW
ENABLE
DECLARE
v_user VARCHAR2(30);
v_date VARCHAR2(30);
BEGIN
SELECT user, TO_CHAR(sysdate, 'DD/M0N/YYYY HH24:MI:SS')
INTO v_user, v_date FROM dual;
IF INSERTING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc,user_name,
entry_date, operation)
VALUES(:NEW.new_skill_desc, NULL, v_user, v_date, 'Insert');
ELSIF DELETING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc, user_name,
entry_date, operation)
VALUES(NULL, :OLD.new_skill_desc, v_user, v_date, 'Delete');
ELSIF UPDATING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc, user_name,
entry_date, operation)
VALUES(:NEW.new_skill_desc, :OLD.new_skill_desc, v_user, v_date,'update');
END IF;
END;
这是db_lds_skill的表,我要保存的审计记录在这里
CREATE TABLE DB_LDS_SKILL
(NEW_SKILL_DESC VARCHAR2(30),
OLD_SKILL_DESC VARCHAR2(30),
USER_NAME VARCHAR2(30),
ENTRY_DATE VARCHAR2(30),
OPERATION VARCHAR2(30)
);
您似乎在:NEW中的:NEW.NEW\u skill\u desc中添加了错误的列名。您必须为表LDS\u SKILL表指定列,而不是db\u LDS\u SKILL 下面是我在本地创建的,运行良好,请注意,我用to_char替换了to_date,用MON替换了M0N
您似乎在:NEW中的:NEW.NEW\u skill\u desc中添加了错误的列名。您必须为表LDS\u SKILL表指定列,而不是db\u LDS\u SKILL 下面是我在本地创建的,运行良好,请注意,我用to_char替换了to_date,用MON替换了M0N
“新”是否会被冗余地加倍?我的意思是,也许你打算使用“:NEW.SKILL_DESC”而不是“NEW.NEW_SKILL_DESC”。@a_horse_和_no_name我已经在那里添加了创建表sytax。@SmileKisan还请添加LDS_SKILL的ddl看起来LDS_SKILL没有一个名为NEW_SKILL_DESC的列。此外,你不需要从dual中选择;您可以直接分配变量,例如v_user:=user;v_日期:=系统日期;“新”是否会被冗余地加倍?我的意思是,也许你打算使用“:NEW.SKILL_DESC”而不是“NEW.NEW_SKILL_DESC”。@a_horse_和_no_name我已经在那里添加了创建表sytax。@SmileKisan还请添加LDS_SKILL的ddl看起来LDS_SKILL没有一个名为NEW_SKILL_DESC的列。此外,你不需要从dual中选择;您可以直接分配变量,例如v_user:=user;v_日期:=系统日期;你把OP转到了_charsysdate。。。进入到\u datesysdate。。。我猜这是打字错误?你不应该在已经是约会的事情上约会@Boneist我同意,但如果他想指定日期的格式,他会使用to_date吗?@Moudiz如果某个数据类型是日期数据,那么它已经是Oracle的内部日期格式了。如果您希望以特定格式显示它或在其他地方使用它,则必须使用to_char将其转换为该特定格式的字符串。否则,就别管它了。@Boneist好的,谢谢你的建议,我编辑我的问题,条件是他的表格结构输入为VARCHAR2,你把OP改为charsysdate。。。进入到\u datesysdate。。。我猜这是打字错误?你不应该在已经是约会的事情上约会@Boneist我同意,但如果他想指定日期的格式,他会使用to_date吗?@Moudiz如果某个数据类型是日期数据,那么它已经是Oracle的内部日期格式了。如果您希望以特定格式显示它或在其他地方使用它,则必须使用to_char将其转换为该特定格式的字符串。否则,就别管它了。@Boneist好的,谢谢你的建议,我编辑我的问题,条件是他的表格输入日期为varchar2
drop table db_lds_skill
/
create table db_lds_skill
(new_skill_desc varchar2(100) null,
old_skill_desc varchar2(100) null,
user_name varchar2(100) null,
entry_date varchar2(100),
operation varchar2(100) null
)
/
drop table LDS_SKILL
/
create table LDS_SKILL
(new_skill_desc varchar2(100) null,
old_skill_desc varchar2(100) null,
user_name varchar2(100) null,
entry_date varchar2(100) nulll,
operation varchar2(100) null
)
/
CREATE OR REPLACE TRIGGER lds_skill_trig
BEFORE INSERT OR DELETE OR UPDATE ON LDS_SKILL
FOR EACH ROW
ENABLE
DECLARE
v_user VARCHAR2(30);
v_date VARCHAR2(30);
BEGIN
SELECT user, TO_CHAR(sysdate, 'DD/MON/YYYY HH24:MI:SS')
INTO v_user, v_date FROM dual;
IF INSERTING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc,user_name,
entry_date, operation)
VALUES(:NEW.new_skill_desc, NULL, v_user, v_date, 'Insert');
ELSIF DELETING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc, user_name,
entry_date, operation)
VALUES(NULL, :OLD.new_skill_desc, v_user, v_date, 'Delete');
ELSIF UPDATING THEN
INSERT INTO db_lds_skill(new_skill_desc, old_skill_desc, user_name,
entry_date, operation)
VALUES(:NEW.new_skill_desc, :OLD.new_skill_desc, v_user, v_date,'update');
END IF;
END;
/
insert into LDS_SKILL (new_skill_desc) values('pp')
/
commit
/