如何在Oracle存储过程的MERGE语句中插入子查询返回值
Oracle 存储过程MERGE语句问题修正方案
- 插入字段与值数量不匹配:INSERT子句仅声明了5个目标字段,VALUES中包含了子查询返回的SK_FECHA共6个值,需要在INSERT字段列表中补充SK_FECHA字段
- 日期函数不符合Oracle语法:Oracle没有内置
MONTH()、YEAR()函数,需要替换为EXTRACT(MONTH FROM 日期字段)或者TO_NUMBER(TO_CHAR(日期字段,'MM'))的写法提取年月 - 语法符号错误:VALUES子句的括号未闭合就使用了分号,打断了MERGE语句的完整结构
- 存储过程名称不匹配:开头定义的存储过程名为
P_FORMULARIO,结尾END后标记的名称为P_EQUIPAMIENTO,名称不一致会触发编译错误 - 可选校验:USING子查询中的
EQUIPAMEINTO_ID字段存在拼写错误的可能,可对照ODS_FORMULARIO表的实际字段名确认调整
修正后完整代码
CREATE OR REPLACE PROCEDURE P_FORMULARIO IS BEGIN MERGE INTO HT_FORMULARIO d USING (SELECT id, METODO_ID, TIPO_ID, DEPARTAMENTO_ID, EQUIPAMEINTO_ID, FECHAINICIO FROM ODS_FORMULARIO) o ON (d.ID_CAMPO = o.id) WHEN MATCHED THEN UPDATE SET d.SK_METODO_MUEST = o.METODO_ID, d.SK_TIPO_MUESTRA = o.TIPO_ID, d.SK_DEPARTAMENTO = o.DEPARTAMENTO_ID, d.SK_EQUIPAMIENTO = o.EQUIPAMEINTO_ID WHEN NOT MATCHED THEN INSERT (ID_CAMPO, SK_METODO_MUEST, SK_TIPO_MUESTRA, SK_DEPARTAMENTO, SK_EQUIPAMIENTO, SK_FECHA) VALUES (o.id, o.METODO_ID, o.TIPO_ID,o.DEPARTAMENTO_ID, o.EQUIPAMEINTO_ID, (SELECT SK_FECHA FROM dt_fecha WHERE mes = EXTRACT(MONTH FROM o.FECHAINICIO) AND anio = EXTRACT(YEAR FROM o.FECHAINICIO))); COMMIT; END P_FORMULARIO; /
内容的提问来源于stack exchange,提问作者Jimena
相关产品推荐
相关产品推荐

