【问题标题】:How to insert values from a subquery in merge sentence如何在合并语句中插入子查询中的值
【发布时间】:2021-12-04 01:16:44
【问题描述】:

我想在 ORACLE 的存储过程的合并语句中插入一个来自子查询的值。我怎样才能做到这一点?这是我设计的,但它不起作用。

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)
        VALUES (o.id, o.METODO_ID, o.TIPO_ID,o.DEPARTAMENTO_ID, o.EQUIPAMEINTO_ID, 
            (select SK_FECHA from dt_fecha where mes = MONTH( o.FECHAINICIO) and anio = YEAR(o.FECHAINICIO));
    COMMIT;
END P_EQUIPAMIENTO;

不知道能不能这样,谢谢帮助。

【问题讨论】:

  • 有可能,但可以告诉我们您遇到的错误是什么?当我们没有您在此查询中使用的所有表时,很难调试您的代码。但是,如果您告诉我错误和您收到错误的行号,我可能会提供帮助。
  • “……但我不工作。”请不要使用这种笼统的描述,它完全没有提供有关实际问题的信息。添加错误文本或描述您的代码有什么问题。

标签: sql oracle merge subquery sp


【解决方案1】:

您的程序中有一些问题

  • 插入下方的subselect 没有任何意义,因为插入子句中只有五个字段,values 部分中只有五个值。
  • 您将根据IDODS_FORMULARIO 获取与目标表HT_FORMULARIO 匹配的所有记录,然后使用该部分获取那里的年月值。
  • 不清楚是否要使用yearmonth。这些是 java 内置函数,而不是 SQL。
  • 插入遗漏了一个字段。

您的函数在 SQL 中不起作用:

SQL> select month(sysdate) from dual ;
select month(sysdate) from dual
       *
ERROR at line 1:
ORA-00904: "MONTH": invalid identifier

SQL> select year(sysdate) from dual ;
select year(sysdate) from dual
       *
ERROR at line 1:
ORA-00904: "YEAR": invalid identifier

请记住从dt_fecha 表中获取年份和月份的方法,您可能有一些选择:

SQL> select to_char(sysdate,'Month') from dual ;

TO_CHAR(SYSDATE,'MONTH')
------------------------------------
October

SQL> select to_char(sysdate,'YYYY') from dual ;

TO_C
----
2021

SQL> select extract(month from sysdate) from dual ;

EXTRACT(MONTHFROMSYSDATE)
-------------------------
                       10

SQL>  select extract(year from sysdate) from dual ;

EXTRACT(YEARFROMSYSDATE)
------------------------
                    2021

然后您在表DT_FECHA 中有列MES。如果您有带名称的月份商店,则需要使用NLS_LANGUAGE 根据您的语言获取正确的名称。例如,德语

SQL> select TO_CHAR(SYSDATE,'fmDay, DD Month YYYY', 'NLS_DATE_LANGUAGE=''GERMAN''') from dual;

TO_CHAR(SYSDATE,'FMDAY,DDMONTHYYYY','NLS_DATE_LANGUAGE=''GERMAN''')
--------------------------------------------------------------------------------
Samstag, 16 Oktober 2021

话虽如此,您想重构合并并在语句的源部分中使用连接以获得sk_fecha 值。

重要提示:请记住,我假设了一些事情,例如月份以西班牙语存储,但不是大写。如果以大写形式存储,则在to_char 之前使用函数upper。如果是其他语言,请使用正确的nls_language。如果月份存储为数字,那么您可以将to_char'MM'extract 一起使用,如我上面的示例所示

CREATE OR REPLACE PROCEDURE P_FORMULARIO
IS
begin 
    MERGE INTO HT_FORMULARIO d
    USING
    (SELECT 
       odsf.id, 
       odsf.METODO_ID, 
       odsf.TIPO_ID, 
       odsf.DEPARTAMENTO_ID, 
       odsf.EQUIPAMEINTO_ID, 
       odsf.FECHAINICIO, 
       to_char(odsf.FECHAINICIO,'Month', 'NLS_DATE_LANGUAGE=''SPANISH''') as Month, 
       to_char(odsf.FECHAINICIO,'YYYY') as Year , 
       dtf.sk_fecha 
        FROM ODS_FORMULARIO odsf 
                    join dt_fecha dft on dtf.mes = odsf.mes and dtf.anio = odsf.year ) 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 , --a field here is missing--)
        VALUES (o.id, o.METODO_ID, o.TIPO_ID,o.DEPARTAMENTO_ID, o.EQUIPAMEINTO_ID, o.SK_FECHA );
    COMMIT;
END P_EQUIPAMIENTO;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多