Tenemos un requisito para rellenar una tabla principal que consta de columnas de un conjunto de 20 diferentes tablas.

He escrito un procedimiento almacenado para unirse a algunas de las tablas que regreso me máximo número de columnas y los tiene en un cursor.

Ahora. Yo estoy usando un bucle for para recorrer el cursor registros para que yo pueda insertar en la tabla maestra.

Cómo puedo usar una combinación de instrucción en el interior del cursor de bucle, por lo que puedo comprobar si tengo que actualizar los ya existentes fila o insertar una nueva fila en función de si los registros ya existe o no.

Cualquier idea si podemos utilizar la combinación de instrucción en el interior de un cursor para el bucle? Cualquiera de los ejemplos?

InformationsquelleAutor jagamot | 2011-11-30

1 Comentario

  1. 9

    Usted puede hacer un MERGE mediante la selección de datos del cursor de DUAL. Por ejemplo

    Crear un origen y de destino de la tabla con algunos datos

    SQL> create table src ( col1 number, col2 varchar2(10) );
    
    Table created.
    
    SQL> create table dest( col1 number, col2 varchar2(10) );
    
    Table created.
    
    SQL> insert into src values( 1, 'A' );
    
    1 row created.
    
    SQL> insert into src values( 2, 'B' );
    
    1 row created.
    
    SQL> insert into dest values( 1, 'C' );
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.

    Ejecutar la combinación

    SQL> ed
    Wrote file afiedt.buf
    
      1  begin
      2    for x in (select * from src)
      3    loop
      4      merge into dest
      5      using( select x.col1 col1, x.col2 col2
      6               from dual ) src
      7         on( src.col1 = dest.col1 )
      8       when matched then
      9         update set col2 = src.col2
     10       when not matched then
     11         insert( col1, col2 )
     12           values( src.col1, src.col2 );
     13    end loop;
     14* end;
    SQL> /
    
    PL/SQL procedure successfully completed.

    Y comprobar que la combinación hizo lo que quería. Fila 1 se actualizó y la fila 2 se inserta.

    SQL> select * from dest;
    
          COL1 COL2
    ---------- ----------
             1 A
             2 B

    Sin embargo, generalmente no tendría mucho sentido para estructurar el código de esta manera. Te gustaría general, será mejor poner la consulta que desea usar para abrir el cursor en la instrucción MERGE directamente, de manera que en lugar de seleccionar una fila de datos de DUAL, usted está seleccionando todos los datos que desea combinar de todas las tablas que usted está tratando de combinar los datos de. Por supuesto, puede tener sentido para crear una vista de esta consulta que el MERGE declaración puede consultar en el fin de mantener la MERGE declaración legible.

    • en el bucle for, se puede «(select * from src)» ser un cursor?
    • No, No puede ser un cursor. Se pueden, y deben, sin embargo, la consulta que se utiliza para abrir el cursor.

Dejar respuesta

Please enter your comment!
Please enter your name here