Mostrando entradas con la etiqueta Procedimientos Almacenados. Mostrar todas las entradas
Mostrando entradas con la etiqueta Procedimientos Almacenados. Mostrar todas las entradas

sábado, 4 de julio de 2020

Procedimientos almacenados, INSERT SELECT , UPDATE y MERGE con Oracle

Esto es un ejemplo de un procedimiento almacenado de Oracle con operaciones genéricas de creación del procedimiento almacenado, un INSERT SELECT, que consiste en un INSERT que se alimenta de un SELECT de otra tabla o tablas normalmente unidas por INNER JOIN.
A continuación hay un UPDATE normal y corriente con sus actualizaciones de campos y las condiciones de actualización.

También se ha incluido un MERGE que es como un UPDATE pero algo más complejo.

El MERGE utiliza también una SELECT que también puede ser compleja y al final se hace una comparación de la SELECT con la tabla a actualizar campo a campo con un on similar a los de un INNER JOIN con la condición de que estos campos deben ser Primary Key de sus tablas respectivas. Donde se produzca la coincidencia se actualiza el campo indicado de la tabla con el valor tomado de la SELECT interior.

Finalmente las instrucciones de cierre de procedimiento almacenado, también se muestran al comienzo y al final las instrucciones  DBMS_OUTPUT.put_line que muestran por pantalla o en un log el resultado de las acciones por la que va pasando, en este caso muestra la  fecha, hora y un comentario con las actividades que se están realizando.


Este es el Procedimiento almacenado.


--COMIENZO SP

create or replace PROCEDURE                                                                INSERT_NOMBRE AS 
BEGIN

DBMS_OUTPUT.put_line(TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH24:MI:SS'));
DBMS_OUTPUT.put_line('Ejemplos INSERT SELECT y UPDATE-MERGE');


--INSERT SELECT SP_TABLA1

INSERT INTO PROPIETARIO.NOMBRE_TABLA1
  (
    ID_A,
    CAMPO2_B,
    CAMPO3_C,
    CAMPO4_D
  )
SELECT 
TB4.ID1_A, TB3.CAMPO1_B, TB3.CAMPO2_C, TB2.CAMPO1_D from PROPIETARIO.TABLA2 TB2 
INNER JOIN PROPIETARIO.TABLA3 TB3 ON TB2.ID = TB3.ID
INNER JOIN PROPIETARIO.TABLA4 TB4 ON TB4.ID2 = TB3.ID2;


--UPDATE NORMAL 

UPDATE PROPIETARIO.TABLA1 TB1
SET CAMPO1 = expression1,
    CAMPO2 = expression2,
    ...
    CAMPO_N = expression_n
WHERE condiciones;


--MERGE

Los campos del on ( t2.ID = t1.ID) deben ser primary key de la tabla.

merge into PROPIETARIO.TABLA1 t1
using (SELECT A.COD_OBJT , B.DES_VALEXT  
from  PROPIETARIO.TABLA2 A inner join  PROPIETARIO.TABLA3 B ON A.ID = B.ID         
where B.CAMPO3 = 'Valor' ) t2
on ( t2.ID = t1.ID)
when matched then update set t1.CAMPO1 = t2.CAMPO1 ;


--FIN SP

----------------------------------------------------------------
DBMS_OUTPUT.put_line(TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH24:MI:SS'));
DBMS_OUTPUT.put_line('FIN PROCESO');
COMMIT;

--END SP_TABLA1;


Un merge más genérico.

merge into PROPIETARIO.TABLA1 t1
using (Select COD_CAMPO1,DES_CAMPO2 from  PROPIETARIO.TABLA2) t2
on ( t2.COD_CODIGO = t1.COD_CODIGO)

when matched then update set t1.DES_CAMPO_T1 = t2.DES_CAMPO_T2;

Y otro tipo de update.

UPDATE  
        (SELECT A.DES_ORIGEN AS old_value,
                E.DES_DESTINO AS new_value 
        FROM PROPIETARIO.TABLA1 A INNER JOIN PROPIETARIO.TABLA2 E ON A.COD_OBJT = E.COD_OBJT
        where E.CAMPO_X = 'Condición' )

        SET old_value = new_value; 

El procedimiento almacenado se crea en el entorno Oracle SQL developer.

Procedimiento almacenado en Oracle SQL Developer

Exists

SELECT Campo1
  FROM Tabla1 d
  WHERE EXISTS
  (SELECT * FROM Tabla2 e
    WHERE d.Campo1
    = e.Campo1);

Llamada desde Visual Basic

Si queremos llamar a un SP desde VB hacemos lo siguiente:

Const Tabla = "Tabla"

 Sub CargaTabla()

        Dim srSQL As StreamReader
        Dim strConsulta As String

        Try

            strStartupPath = My.Application.Info.DirectoryPath
            srSQL = New System.IO.StreamReader(strStartupPath & "\Ejecuta_SP.sql")
            strConsulta = srSQL.ReadToEnd
            cmdPD = New OleDb.OleDbCommand(strConsulta, cnxPD)
            cmdPD.CommandType = CommandType.StoredProcedure
            cmdPD.ExecuteNonQuery()
            bs.DataSource = ds.Tables(Tabla)

        Catch
            MsgBox("Se ha producido un error insertando los datos en TABLA: " & Err.Description)
        End Try

    End Sub


EN EJECUTA_SP va


NOMBRE_SP

sábado, 16 de abril de 2016

Procedimientos almacenados con SQL Server. 1ª Parte

Creación

Existen dos formas de crear procedimientos almacenados:
Utilizando la sentencia CREATE PROCEDURE o a través del Administrador corporativo.

Procedimientos almacenados SQL Server

martes, 2 de julio de 2013

Depurar un procedimiento almacenado de SQL Server 2005


Desde la versión 2005 de SQL Server no se pueden depurar procedimientos almacenados directamente desde el SQL Management Studio, pero  si se pueden depurar desde Visual Studio 2005. Para ello el proceso es bastante sencillo.
Creo un nuevo proyecto de Visual Studio 2005  y Desde el explorador de servidores:

Depurar un procedimiento almacenado de SQL Server 2005

Se añade una conexión:


Añadir conexión

Se eligen los parámetros de conexión a la Base de datos deseada.

parámetros de conexión a SQL Server

se elige el procedimiento a depurar.

Depurar un procedimiento almacenado

 Se colocan los parámetros correspondientes  (sin poner ningún tipo de comillas en los char) y  se pulsa OK


Depurar un procedimiento almacenado

Con esto ya se puede entrar en modo depuración:   Se avanza paso a paso con F11

Depurar un procedimiento almacenado

Se puede depurar casi como un programa de .NET y se puede ver el valor que van tomando las variables.
El único inconveniente es que tambien hay que tener instalado Visual Studio 2005 o superior.