约束停在我自己的程序删除,但同样删除运行在sqlplus
问题描述:
在运行自己的package.procedure的内部的两个DELETE
声明:约束停在我自己的程序删除,但同样删除运行在sqlplus
DELETE FROM ENT_PLANT_RELATIVE WHERE CHILD_ID = plant_id;
DELETE FROM ENT_PLANT_ITEM WHERE PLANT_ID = plant_id;
...我收到关于第二DELETE
完整性约束违约(第一工作正常):
SQL> call P.DeletePlantItem(112808,1,:err);
ORA-02292: integrity constraint
(XXXXX.EAITA_PLANT_ITEM_ID_FK) violated - child record found
有含FK中含有该名称的约束表中没有子记录:
SQL> select count(plant_item_id) from ent_application_item_to_access
where plant_item_id = 112808;
COUNT(PLANT_ITEM_ID)
--------------------
0
...并且该表中只有一列使用PLANT_ITEM_ID。
在SQL * Plus(我从中调用该过程)直接运行可疑语句DELETE
语句(从过程中复制)时,它按预期工作。
我有:示出
- 禁用第一完整性约束,只有有另一个类似的约束出现在另一个表中,类似于不含FK
- 禁用示出的第二个类似的完整性约束...同上
- 将单条记录插入到主表和我试图从中删除的一个子表中,然后再次尝试使用与先前存在的记录相同的结果
- 手动插入单个i TEM成
ENT_PLANT_ITEM
,在程序注释掉不必要DELETE
,并试图调用它:相同的结果 - 尝试了
COMMIT
从子表(ENT_PLANT_RELATIVE) - 用于
put_line
以获得第一(成功的)缺失后立即SQLERRM含有上面所示识别所述约束 - 检查触发器插入记录的存在(不必要的,感觉,如在表中存在表示约束问题没有子数据)
- 用于
IF
逻辑地打破过程分成两个单独的处理两个的程序10个语句分开:相同的结果 - 检查特权,尽我所知,尽管我假设因为我可以从一个上下文(SQLPlus)
DELETE
,并创建包和程序在第一位,我应该能够该程序(呼叫) - 还假定SQLERRM将报告特权错误
- 阅读约束
- 阅读尽可能多的堆栈溢出的问题,因为我能找到引用约束和参照完整性 在线Oracle文档
包定义是:
CREATE OR REPLACE PACKAGE P AS
PROCEDURE InsertPlantItem(plant_desc IN VARCHAR2, parent_desc IN VARCHAR2, test IN NUMBER, err OUT VARCHAR2);
PROCEDURE DeletePlantItem(plant_id IN NUMBER, test IN NUMBER, err OUT VARCHAR2);
END P;
综上所述,为什么我可以从SQL * Plus命令行删除行X在数据表Y,但不是通过我创建,因为在一个表中我不约束的存储过程没有任何钥匙?
答
的问题确实在第二DELETE
声明:
DELETE FROM ENT_PLANT_ITEM WHERE PLANT_ID = plant_id;
我创造了一个IN
参数调用plant_id
,传递一个6位数字,并没有意识到我被有效地询问过程删除所有项目在数据库中约束不会阻止它。在所有大写字体中更为明显:
DELETE FROM ENT_PLANT_ITEM WHERE PLANT_ID = PLANT_ID;
列名显然具有比参数更高的优先级。
你可以PLZ显示软件包的定义,只是为了看看你使用的参数是否在顺序。 – Rams
我已经把上面的包定义。我强烈怀疑这些参数是正确的,因为子表中的第一个DELETE有效;第二次删除使用相同的plant_id。谢谢参观。 –