SQL Java
SQL Java
SQL Java
Para crear un Stored podemos utilizar el Enterprise Manager o el Query Analizer. Si lo hacemos por el Enterprise Manager, encima de la base de datos, desplegaremos la carpeta de storeds, botn derecho y "New Stored Procedure" El Enterprise Manager por defecto pone: CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS En Procedure Name colocamos el nombre del Stored que deseamos, y a continuacin del AS las consultas que queramos: CREATE PROCEDURE DIC_FORO AS SET NOCOUNT ON SELECT Campos FROM Tabla With(NoLock) SET NOCOUNT OFF GO Los Storeds admiten parmetros. Sirven para poder realizar querys ms precisas. Por ejemplo: CREATE PROCEDURE DIC_FORO ( @IdUsuario int=0 ) AS SET NOCOUNT ON SELECT * FROM Usuario With(NoLock)
WHERE Usuario=@IdUsuario
Tambin podemos utilizar parmetros de salida, para retornar datos. Para ello declararemos el parmetro como Output.
CONSULTA: IF NOT EXISTS(Select nombre from persona wnere nombre = @nombre) Begin
12062009
10 Votes
Saludos amigos en esta ocasin leyendo me encontr con un tema muy interesante acerca de las tablas temporales en SQL, les dejo lo que traduje del tema con una explicacin y ejemplo de como crear tablas temporales locales, globales y variables de tabla, dentro del Motor de Base de Datos de SQL Server 2008.
Tablas Temporales.
Las tablas temporales son consideradas tablas regulares, y estas se almacenan automticamente en la base de datos de tempdb. Las tablas temporales se pueden usar en los siguientes escenarios: Como alternativa a los cursores: por ejemplo, en lugar de utilizar un cursor de Transact-SQL para recorrer un conjunto de resultados y realizar tareas basadas en cada fila, en su lugar puede utilizar una tabla temporal. Usando un bucle WHILE, puede recorrer cada fila de la tabla y realizar la accin de la fila especificada, posteriormente debe eliminar la fila de la tabla temporal. Como almacenamiento incremental de conjuntos de resultados: Por ejemplo, imaginemos que tiene una sola consulta SELECT que realiza una combinacin JOINcon diez tablas. A veces las consultas con varias combinaciones JOINS pueden funcionar de manera incorrecta. Una tcnica para intentar es la de fraccionar o fragmentar una consulta grande en consultas ms pequeas. Si usamos tablas temporales, podemos crear conjuntos de resultados intermedios basados en consultas de menor
tamao, en lugar de intentar ejecutar una consulta nica que sea demasiado grande y de combinaciones mltiples multi-joined. Como temporal en la sobrecarga baja de bsqueda de tabla: Por ejemplo, imagine que usted est utilizando una consulta que tarda varios segundos en ejecutarse, pero slo muestra un pequeo conjunto de resultados, el cual desea utilizar en varias reas de su procedimiento almacenado, pero cada vez que se llama se incurre en el tiempo de ejecucin de la consulta general. Para resolver esto, puede ejecutar la consulta una sola vez en el procedimiento, llenando una tabla temporal, de esta manera se puede hacer referencia a la tabla temporal en varios lugares en su cdigo, sin incurrir en una sobrecarga de resultados adicional. Existen dos tipos de tablas temporales: Globales y Locales. Las tablas temporales Locales se escriben anteponiendo el smbolo # y tablas
Seleccionando los datos de la tabla temporal. --Seleccionando los datos de la tabla temporal SELECT * FROM #ProductosResumen;
Resultado.
Nota: Para que el ejemplo funcione deben de ejecutar en un solo bloque de instrucciones todo el cdigo que coloque anteriormente. Para este caso yo llene mi tabla temporal con datos de una tabla que ya tenia creada en la base de datos, ustedes pueden utilizar un insert normal.
pueden crear versiones simultneas de una tabla temporal Global , ya que esto generar un conflicto
de nombres. Las tablas temporales Globales de eliminan explcitamente de SQL Server ejecutandoDROP TABLE. Tambin se eliminan automticamente despus de que se cierra la conexin que la creo, la tabla
temporal Global no es referenciada por otras conexiones, pero es muy raro ver que se utilicen tablas temporales Globales en bases de datos en produccin. Es importante considerar cuando una tabla va o debe ser compartida a travs de conexiones, se debe crear una tabla real, en lugar de una tabla temporal Global. No obstante, SQL Server ofrece esto como una opcin. Creando la tabla temporal Global: --Creando la tabla temporal Global CREATE TABLE ##Roles ( idRol int NOT NULL PRIMARY KEY, nombre varchar(30) NULL, activo bit NULL ); Insertando y seleccionando datos de la tabla temporal global: -- Insertando datos en la tabla temporal global INSERT INTO ##Roles VALUES(1,'Administrador',1), (2,'Supervisor',1), (3,'Programador',0)
-- Seleccionando los datos de la tabla temporal global SELECT * FROM ##Roles; Resultado:
Eliminando la tabla temporal global desde la conexin original que la creo. -- Eliminando la tabla temporal global
DROP TABLE
##Roles;
Variables de Tabla.
Por otro lado tenemos las Variables de Tabla que son un tipo de datos que puede ser utilizados en un lote Transact-SQL (Batch), procedimiento almacenado o funcin; estas variables de tabla son creado y definidas de forma similar a una tabla, slo con un alcance de vida estrictamente definido. Las Variables de tabla suelen ser buenos reemplazos de tablas temporales siempre y
Duracin o alcance. La duracin de la variable de tabla slo vive durante la ejecucin del lote, funcin, o procedimiento almacenado. Tiempos de bloqueo ms cortos. Por el estrecho alcance o tiempo de vida. Menos re compilaciones cuando se usa en los procedimientos almacenados. Como se menciono anteriormente, hay inconvenientes para utilizar las variables de tabla. El
rendimiento de las variable de tabla se ve afectado cuando el resultado es demasiado grande o cuando los datos de la columna de cardinalidad son fundamentales para la optimizacin del proceso de consulta.
La sintaxis para crear una variable de tabla es similar a la de crear una tabla normal, se utiliza la palabra clave DECLARE y el nombre de tabla, anteponiendo el smbolo @: DECLARE @TableName TABLE
(column_name <data_type> [ NULL | NOT NULL ] [ ,...n ] ) Creando una variable de tabla: -- Creando la variable de tipo tabla. DECLARE @EstatusUsuarios TABLE ( idEstatus int NOT NULL PRIMARY KEY, nombre varchar(30) NULL ) Insertando y seleccionando datos de la variable tabla: -- Insertando en la variable de tipo tabla. INSERT INTO @EstatusUsuarios VALUES (1,'Activo'), (2,'Inactivo'),
(3,'Bloqueado')
-- Consultando datos de la variable de tipo tabla. SELECT * FROM @EstatusUsuarios; Al terminar la ejecucin del batch o bloque de instrucciones se eliminara la variable tabla, o si colocamos una instruccin GO automticamente se eliminara y no la podremos utilizar como los muestro en el siguiente ejempl, recuerde que los ejemplo para claridad los coloque separados, pero los debe de ejecutar completos como lo hago abajo para el caso de la variables de tabla: -- Creando la variable de tipo tabla. DECLARE @EstatusUsuarios TABLE ( idEstatus int NOT NULL PRIMARY KEY, nombre varchar(30) NULL )
-- Insertando en la variable de tipo tabla. INSERT INTO @EstatusUsuarios VALUES (1,'Activo'), (2,'Inactivo'), (3,'Bloqueado')
Esto es por que como lo comente anteriormente el tiempo de vida de la variable tabla termina al ejecutarse el bloque de instrucciones, en este caso termino con el GO. Cuando encontremos problemas de rendimiento, debemos de asegurarnos de probar todas las soluciones y alternativas, y no necesariamente asumir que una de las opciones (tablas Temporales) son menos deseables que otras (variables de tabla). Espero les sea de ayuda, se que esta un poco largo el Post, pero creo vale la pena leerlo.
votando
aqu: http://blogit.ms/TopBloggers.aspx en la categora SQL Server. Los pasos para votar estn aqu
Clic Aqu.
create procedure SHOW_SUPPLIERS as select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME from SUPPLIERS, COFFEES where SUPPLIERS.SUP_ID = COFFEES.SUP_ID order by SUP_NAME
El siguiente cdigo pone la sentencia SQL dentro de un string y lo asigna a la variablecreateProcedure, que utilizaremos ms adelante.
String createProcedure = "create procedure SHOW_SUPPLIERS " + "as " + "select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " + "from SUPPLIERS, COFFEES " + "where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " + "order by SUP_NAME";
El siguiente fragmento de cdigo utiliza el objeto Connection, con para crear un objetoStatement, que es utilizado para enviar la sentencia SQL que crea el procedimiento almacenado en la base de datos.
SUP_NAME ---------------Acme, Inc. Acme, Inc. Superior Coffee Superior Coffee The High Ground
Observa que el mtodo utilizado para ejecutar cs es executeQuery porque cs llama a un procedimiento almacenado que contiene una peticin y esto produce una hoja de resultados. Si el procedimiento hubiera contenido una sentencia de actualziacin o una sentencia DDL, se hubiera utilizado el mtodo executeUpdate. Sin embargo, en algunos casos, cuando el procedimiento almacenado contiene ms
de una sentencia SQL producir ms de una hoja de resultados, o cuando contiene ms de una cuenta de actualizacinm o alguna combinacin de hojas de resultados y actualizaciones. en estos casos, donde existen mltiples resultados, se debera utilizar el mtodo execute para ejecutar CallableStatement. La clase CallableStatement es una subclase de PreparedStatement, por eso un objetoCallableStatement puede tomar parmetros de entrada como lo hara un objetoPreparedStatement. Adems, un objeto CallableStatement puede tomar parmetros de salida, o parmetros que son tanto de entrada como de salida. Los parmetros INOUT y el mtodo execute se utilizan raramente.
public static Connection conectar(String pHost, String pUser, String pPassword, String Exception { try { String databaseURL = "jdbc:mysql://" + pHost + "/" + pDataBase; Class.forName("com.mysql.jdbc.Driver"); con_mysql = java.sql.DriverManager.getConnection(databaseURL, pUser, p //System.out.println("Conexion con MySQL Establecida.."); } catch (Exception e) { e.printStackTrace(); throw new Exception(e); } return con_mysql; } }
En la siguiente clase veremos como implementar la clase anterior para hacer la conexion, adems de invocar el procedimiento almacenado.
1 // imports necesarios 2 import conexionDB.ConexionMySQL; 3 import java.sql.CallableStatement;
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
. . Connection connMY = null; try{ // creamos la conexion connMY = ConexionMySQL.conectar("192.168.1.100", "sa", "*******", "devtroce"); // establecemos que no sea autocommit, // asi controlamos la transaccion de manera manual connMY.setAutoCommit(false); /* instanciamos el objeto callable statement * que usaremos para invocar el SP * La cantidad de "?" determina la cantidad * parametros que recibe el procedimiento */ CallableStatement prcProcedimientoAlmacenado = connMY.prepareCall("{ call NuestroProce }"); // cargar parametros al SP prcProcedimientoAlmacenado.setInt("pParametro1", 1); prcProcedimientoAlmacenado.setString("pParametro2", "Devtroce.com"); prcProcedimientoAlmacenado.setInt("pParametro3", 49); // ejecutar el SP prcProcedimientoAlmacenado.execute(); // confirmar si se ejecuto sin errores connMY.commit(); } catch (Exception e) { // deshacer la ejecucion en caso de error connMY.rollback(); // informar por consola e.printStackTrace(); } finally { // cerrar la conexion connMY.close(); }
A pedido de Moise, edito el post y agrego la estructura de la tabla y un Stored Procedure que cumple para ejecutar con el cdigo aqu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE TABLE devtroce( id int NOT NULL, campo2 varchar(50) NOT NULL, campo3 int NOT NULL ) ON PRIMARY CREATE PROCEDURE NuestroProcedimientoAlmacenado @id int, @campo2 varchar(50), @campo3 int AS BEGIN INSERT INTO devtroce VALUES ( @id, @campo2, @campo3); END
Publicarlo en Twitter
1 1 1 1 1 1 1 1 1