PLS-00049 不良绑定变量 [关闭]
Posted
技术标签:
【中文标题】PLS-00049 不良绑定变量 [关闭]【英文标题】:PLS-00049 BAD BIND VARIABLE [closed] 【发布时间】:2014-03-22 21:19:21 【问题描述】:我正在尝试设置一个触发器,以便每当更新 PL_Witness 表时,它都会在作为审计表的 PLAUDWIT 表中记录这一点。
但是,每次我尝试制作此触发器时,我都会得到错误的绑定变量,并且我也在尝试制作的其他审计触发器上得到这个。我的常见问题是什么?
感谢所有帮助!
CREATE TABLE "PL_WITNESS"
( "WITNESS_ID" NUMBER(*,0) NOT NULL ENABLE,
"WITNESS_NAME" VARCHAR2(30) NOT NULL ENABLE,
"WITNESS_ADDRESS" VARCHAR2(100),
"FK1_WITNESS_TYPE_ID" NUMBER(*,0) NOT NULL ENABLE,
CONSTRAINT "PK_WITNESS" PRIMARY KEY ("WITNESS_ID") ENABLE
)
/
ALTER TABLE "PL_WITNESS" ADD CONSTRAINT "FK1_WITNESS_WTYPE" FOREIGN KEY ("FK1_WITNESS_TYPE_ID")
REFERENCES "PL_WITNESS_TYPE" ("WITNESS_TYPE_ID") ENABLE
/
.
DROP TABLE PLAUDWIT
CREATE TABLE PLAUDWIT (
AUD_AWitnessID NUMBER,
AUD_AWitnessType NUMBER,
AUDIT_USER varchar2(50),
AUDIT_DATE DATE,
AUDIT_ACTION varchar2(10));
。 创建或替换触发器 TRG_PLAUDWIT
AFTER INSERT OR DELETE OR UPDATE ON PL_WITNESS
FOR EACH ROW
DECLARE
v_trigger_task varchar2(10);
BEGIN
IF UPDATING
THEN
v_trigger_task := 'Update';
ELSIF DELETING
THEN
v_trigger_task := 'DELETE';
ELSIF INSERTING
THEN
v_trigger_task := 'INSERT';
ELSE
v_trigger_task := NULL;
END IF;
IF v_trigger_task IN ('DELETE','UPDATE') THEN
INSERT INTO PLAUDWIT (AWitnessID, AWitnessType, AUDIT_USER, AUDIT_DATE, AUDIT_ACTION)
VALUES
(:OLD.AWitnessID, :OLD.AWitnessType, UPPER(v('APP USER')), SYSDATE, v_trigger_task);
ELSE
INSERT INTO PLAUDWIT (AWitnessID, AWitnessType, AUDIT_USER, AUDIT_DATE, AUDIT_ACTION)
VALUES
(:NEW.AWitnessID, :NEW.AWitnessType, UPPER(v('APP USER')), SYSDATE, v_trigger_task);
END IF;
结束 TRG_PLAUDWIT;
【问题讨论】:
【参考方案1】:您指的是以'A'
开头且没有下划线的绑定变量,例如:OLD.AWitnessID
,但您的表格列只是WITNESS_ID
。所以他们不匹配,并产生这个错误。你甚至没有WITNESS_TYPE
列。
然后在您的 insert
语句中,您的审计表中的列名也错误。您还将变量设置为Update
,但检查UPDATE
- 请记住,比较对于字符串值是区分大小写的。
这将与您的架构一起编译:
CREATE OR REPLACE TRIGGER TRG_PLAUDWIT
AFTER INSERT OR DELETE OR UPDATE ON PL_WITNESS
FOR EACH ROW
DECLARE
v_trigger_task varchar2(10);
BEGIN
IF UPDATING THEN
v_trigger_task := 'UPDATE';
ELSIF DELETING THEN
v_trigger_task := 'DELETE';
ELSIF INSERTING THEN
v_trigger_task := 'INSERT';
ELSE
v_trigger_task := NULL;
END IF;
IF v_trigger_task IN ('DELETE','UPDATE') THEN
INSERT INTO PLAUDWIT (AUD_AWitnessID, AUD_AWitnessType, AUDIT_USER,
AUDIT_DATE, AUDIT_ACTION)
VALUES (:OLD.Witness_ID, :OLD.FK1_WITNESS_TYPE_ID, UPPER(v('APP USER')),
SYSDATE, v_trigger_task);
ELSE
INSERT INTO PLAUDWIT (AUD_AWitnessID, AUD_AWitnessType, AUDIT_USER,
AUDIT_DATE, AUDIT_ACTION)
VALUES (:NEW.Witness_ID, :NEW.FK1_WITNESS_TYPE_ID, UPPER(v('APP USER')),
SYSDATE, v_trigger_task);
END IF;
END TRG_PLAUDWIT;
/
SQL Fiddle showing no compilation errors.
【讨论】:
第 21 行错误:PLS-00049:错误绑定变量 'OLD.WITNESSID' 1. 创建或替换触发器 TRG_PLAUDWIT 2. 在 PL_WITNESS 上插入、删除或更新后 3. 对每一行 4. 声明 尝试了所有这些修改,仍然出现错误。 @Chuck - 你仍然没有下划线。你关注你的架构了吗? 谢谢。我的错误,漫长的一天和新的触发器! RA-20102:应用程序集合 PLSQL_OBJECT_SOURCE 不存在。 - 在另一个触发器上修改了相同的错误,现在得到这个错误,有什么建议吗?以上是关于PLS-00049 不良绑定变量 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:任何人都可以帮我解决Error(2,32):PLS-00049:错误的绑定变量'WORKED_HOURS'
条件 old 不等于 new 的 Oracle 触发器以错误 PLS-00049、PL/SQL: ORA-00933 结束