Oracle 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

当我运行触发器时,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
  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
/