es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Declaración MERGE con definición “WITH FUNCTION”

Estoy intentando usar una función declarada en una cláusula WITH en una sentencia MERGE.
Aquí está mi código:

create table test
  (c1 varchar2(10),
   c2 varchar2(10),
   c3 varchar2(10));



insert into test(c1, c2) values ('a', 'A');
insert into test(c1, c2) values ('b', 'A');

select * from test;

begin
with function to_upper(val varchar2) return varchar is
begin
    return upper(val);
end;
merge into test a
    using (select * from test) b
on (upper(a.c1) = upper(b.c2))
when matched then 
    update set a.c3 = to_upper(a.c1);
end; 

Pero estoy obteniendo este error:

Informe de error – ORA-06550: línea 2, columna 15: PL/SQL: ORA-00905:
falta palabra clave ORA-06550: línea 2, columna 1: PL/SQL: se ignora
la instrucción SQL ORA-06550: línea 6, columna 1: PLS-00103:
Se ha encontrado el símbolo “MERGE”
06550. 00000 – “línea %s, columna %s:\n%s”
*Causa: Normalmente un error de compilación PL/SQL.
*Acción:

¿Alguien puede explicar por qué no está funcionando, por favor?

Gracias,

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la ubicación de la cláusula WITH. En Oracle, la cláusula WITH debe ir antes de la declaración SELECT o MERGE. Prueba mover la cláusula WITH encima de la declaración MERGE, así:

    create table test
      (c1 varchar2(10),
       c2 varchar2(10),
       c3 varchar2(10));
    
    insert into test(c1, c2) values ('a', 'A');
    insert into test(c1, c2) values ('b', 'A');
    
    with function to_upper(val varchar2) return varchar is
    begin
        return upper(val);
    end;
    
    merge into test a
        using (select * from test) b
    on (to_upper(a.c1) = to_upper(b.c2))
    when matched then 
        update set a.c3 = to_upper(a.c1);
    

    Al mover la cláusula WITH antes de la declaración MERGE, ahora podemos usar la función ‘to_upper’ dentro de la declaración MERGE. También debes tener en cuenta que debemos usar ‘to_upper’ en lugar de ‘upper’ en la cláusula ON, ya que ‘to_upper’ es el nombre de nuestra función.

Comments are closed.