Oracle SQL中如何用IF ELSE条件编写存储过程更新两张不同的表
带条件分支的MERGE逻辑转PL/SQL存储过程实现方案
完整实现代码
CREATE OR REPLACE PROCEDURE proc_update_table1( p_site_projects_id NUMBER, -- 对应原绑定变量:SITE_PROJECTS_ID: p_site_info_id NUMBER, -- 对应原绑定变量:SITE_INFO_ID: p_value1 VARCHAR2, -- 对应原绑定变量:value1: p_value2 VARCHAR2, -- 对应原绑定变量:value2: p_value3 VARCHAR2 -- 对应原绑定变量:value3: ) IS BEGIN -- 外层分支判断使用哪个数据源逻辑 IF p_site_projects_id IS NOT NULL AND p_site_projects_id != 0 THEN -- 满足条件走table2作为数据源的更新逻辑 MERGE INTO table1 SAI USING (SELECT * FROM table2) AX ON (SAI.SITE_INFO_ID = AX.SITE_INFO_ID) WHEN MATCHED THEN UPDATE SET SAI.column1 = AX.column1, SAI.column2 = AX.column2, SAI.LAST_MODIFIED_BY = AX.LAST_MODIFIED_BY, SAI.LAST_MODIFIED_DATE = SYSDATE; ELSE -- 不满足条件走DUAL作为数据源的更新逻辑 MERGE INTO table1 SAI USING DUAL ON (SAI.SITE_INFO_ID = p_site_info_id) WHEN MATCHED THEN UPDATE SET SAI.SITE_TRAKER_SITE_ID = CASE WHEN p_value1 IS NOT NULL AND p_value2 != '' THEN p_value3 ELSE SAI.SITE_TRAKER_SITE_ID -- 不满足条件保留原值不更新 END, SAI.LAST_MODIFIED_DATE = SYSDATE; END IF; -- 可选:根据事务管理规则补充提交逻辑 -- COMMIT; EXCEPTION WHEN OTHERS THEN -- 可选:补充自定义异常处理逻辑,比如回滚、日志记录 -- ROLLBACK; RAISE; END proc_update_table1; /
注意事项
- Oracle语法中判断变量非空必须使用
IS NOT NULL,!= null的判断结果永远为FALSE,会直接导致逻辑失效,原伪代码中的非空判断要注意修正 - 存储过程的入参数据类型可以根据你的表结构实际定义调整,比如如果SITE_TRAKER_SITE_ID是NUMBER类型,就把p_value3的类型改成NUMBER
- 如果需要对更新行数做后续校验或逻辑处理,可以在每个MERGE语句后通过
SQL%ROWCOUNT获取本次执行影响的行数 - 如果业务逻辑要求更新不存在时要插入对应数据,可以在两个MERGE语句中补充
WHEN NOT MATCHED THEN INSERT分支即可
内容的提问来源于stack exchange,提问作者anaz_Zean07
相关产品推荐
相关产品推荐

