在我自己的Package.Procedure中运行两个DELETE
语句:
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
语句(从程序中复制)(我称之为程序),它按预期工作。
我有:
ENT_PLANT_ITEM
,在过程中注释掉了不必要的DELETE
,然后尝试调用它:相同的结果COMMIT
put_line
获取上面显示的SQLERRM包含标识约束IF
在逻辑上将过程分解为两个单独的过程,分别处理两个DELETE
语句:相同的结果DELETE
,并且首先创建包和过程,我应该能够从过程中(呼叫)包裹定义是:
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命令行删除表y中的行x,但不能通过我创建的存储过程删除,因为表中的约束我没有任何键?
答案 0 :(得分:1)
问题确实存在于第二个DELETE
声明中:
DELETE FROM ENT_PLANT_ITEM WHERE PLANT_ID = plant_id;
我创建了一个名为IN
的{{1}}参数,传入一个6位数的数字,但没有意识到我有效地要求程序删除数据库中的所有项目约束并没有阻止它。它在所有首都都相当明显:
plant_id
列名显然优先于参数。