Oracle - 在删除其他表中的多行之前检查行是否存在
Oracle - Check if row exists before deleting several rows in other tables
如果主 table 的 ID 已经存在,我想删除 Oracle 数据库中的几行:
我试着先做一个 SELECT 来检查主 table 中是否存在 ID,然后根据其他 tables:
中的 ID 删除行
DECLARE
PROJECT_ID PLS_INTEGER;
PROJECT_ID_TO_DELETE PLS_INTEGER;
BEGIN
PROJECT_ID := PROJECTS_SEQ.nextval;
SELECT PROJ_ID INTO PROJECT_ID_TO_DELETE FROM PROJECTS WHERE PROJ_NAME_EN LIKE 'FD Project - CSB - A.1 - CFT - Final Reject of an Increase Movement - Seb';
IF PROJECT_ID_TO_DELETE IS NULL THEN
DELETE FROM PROJECTS_ORG WHERE PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM PROJECTS WHERE PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM MVT_ONGOING WHERE MVT_ONGOING_PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM MVT_HISTORY WHERE MVT_HISTORY_PROJ_ID = PROJECT_ID_TO_DELETE;
END IF;
Insert into PROJECTS (PROJ_ID, ...) values (PROJECT_ID, ...);
Insert into PROJECTS_ORG (PROJ_ID, ...) values (PROJECT_ID, ...);
Insert into MVT_ONGOING (MVT_ONGOING_PROJ_ID, ...);
Insert into MVT_HISTORY (PROJ_ID, ...) values (PROJECT_ID, ...);
END;
我收到错误消息“找不到数据”
能否请您帮助我找到最佳优化解决方案?
谢谢
像这样:
DECLARE
project_id_new PLS_INTEGER;
project_id_to_delete PLS_INTEGER;
BEGIN
BEGIN
SELECT proj_id
INTO project_id_to_delete
FROM projects
WHERE proj_name_en LIKE 'blabla';
DELETE FROM projects_org WHERE proj_id = project_id_to_delete;
DELETE FROM projects WHERE proj_id = project_id_to_delete;
DELETE FROM mvt_ongoing WHERE mvt_ongoing_proj_id = project_id_to_delete;
DELETE FROM mvt_history WHERE mvt_history_proj_id = project_id_to_delete;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
project_id_new := seq.nextval;
INSERT INTO projects (project_id) VALUES (project_id_new);
INSERT INTO projects_org (project_id) VALUES (project_id_new);
END;
它有什么作用?
- 试图找到
PROJ_ID
- 如果找到它,则执行
DELETE
s
- 您不必使用
IF
;如果找到,就会知道。如果未找到,则引发异常
- 否则,
NO_DATA_FOUND
引发异常并处理
- 我选择什么都不做,你可能想做其他事情
插入时(正如您评论的那样,您希望始终这样做):将删除部分包含在它自己的 BEGIN-EXCEPTION-END
块中,以便处理可能的 no_data_found
错误。然后,找到 project_id_new
值(例如,使用序列)并在 INSERT
语句中使用它。
如果主 table 的 ID 已经存在,我想删除 Oracle 数据库中的几行: 我试着先做一个 SELECT 来检查主 table 中是否存在 ID,然后根据其他 tables:
中的 ID 删除行DECLARE
PROJECT_ID PLS_INTEGER;
PROJECT_ID_TO_DELETE PLS_INTEGER;
BEGIN
PROJECT_ID := PROJECTS_SEQ.nextval;
SELECT PROJ_ID INTO PROJECT_ID_TO_DELETE FROM PROJECTS WHERE PROJ_NAME_EN LIKE 'FD Project - CSB - A.1 - CFT - Final Reject of an Increase Movement - Seb';
IF PROJECT_ID_TO_DELETE IS NULL THEN
DELETE FROM PROJECTS_ORG WHERE PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM PROJECTS WHERE PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM MVT_ONGOING WHERE MVT_ONGOING_PROJ_ID = PROJECT_ID_TO_DELETE;
DELETE FROM MVT_HISTORY WHERE MVT_HISTORY_PROJ_ID = PROJECT_ID_TO_DELETE;
END IF;
Insert into PROJECTS (PROJ_ID, ...) values (PROJECT_ID, ...);
Insert into PROJECTS_ORG (PROJ_ID, ...) values (PROJECT_ID, ...);
Insert into MVT_ONGOING (MVT_ONGOING_PROJ_ID, ...);
Insert into MVT_HISTORY (PROJ_ID, ...) values (PROJECT_ID, ...);
END;
我收到错误消息“找不到数据”
能否请您帮助我找到最佳优化解决方案?
谢谢
像这样:
DECLARE
project_id_new PLS_INTEGER;
project_id_to_delete PLS_INTEGER;
BEGIN
BEGIN
SELECT proj_id
INTO project_id_to_delete
FROM projects
WHERE proj_name_en LIKE 'blabla';
DELETE FROM projects_org WHERE proj_id = project_id_to_delete;
DELETE FROM projects WHERE proj_id = project_id_to_delete;
DELETE FROM mvt_ongoing WHERE mvt_ongoing_proj_id = project_id_to_delete;
DELETE FROM mvt_history WHERE mvt_history_proj_id = project_id_to_delete;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;
project_id_new := seq.nextval;
INSERT INTO projects (project_id) VALUES (project_id_new);
INSERT INTO projects_org (project_id) VALUES (project_id_new);
END;
它有什么作用?
- 试图找到
PROJ_ID
- 如果找到它,则执行
DELETE
s- 您不必使用
IF
;如果找到,就会知道。如果未找到,则引发异常
- 您不必使用
- 否则,
NO_DATA_FOUND
引发异常并处理- 我选择什么都不做,你可能想做其他事情
插入时(正如您评论的那样,您希望始终这样做):将删除部分包含在它自己的 BEGIN-EXCEPTION-END
块中,以便处理可能的 no_data_found
错误。然后,找到 project_id_new
值(例如,使用序列)并在 INSERT
语句中使用它。