Mostrando entradas con la etiqueta insert. Mostrar todas las entradas
Mostrando entradas con la etiqueta insert. Mostrar todas las entradas

jueves, 4 de noviembre de 2010

Insertar dinamicamente en Tabla Temporal ORACLE

Las tablas temporales en ORACLE no son como en SQLServer.
La definición de una tabla temporal se almacena en el sistema, como con la de las tablas permanentes, pero los datos permanecerán sólo durante la sesión o transacción, lo cual podemos definir mediante la clausula:


/*Los datos no se eliminan mientras no acabe la sesión:*/
ON COMMIT PRESERVE ROWS

/*O bien:
*Los datos se eliminan al finalizar la transacción*/
ON COMMIT DELETE ROWS

Cabe señalar que, aunque el mismo usuario se conecte dos veces simultaneamente o mientras uno de ellos no termine la sesión, ambas sesiones serán tratadas independientemente,de esta forma lo que un usuario haga en la tabla no le afecta al otro.
Hay buena información en este post:
Tablas temporales en las bases de datos Oracle
Creando una tabla Temporal cuyos datos no se eliminarán mientras la sesión no termine:


CREATE GLOBAL TEMPORARY TABLE TEMP_TABLA
(
NOMBRE VARCHAR2(50),
APELLIDO VARCHAR2(100)
)
ON COMMIT PRESERVE ROWS

Creando una tabla temporal idéntica a una tabla existente:


CREATE GLOBAL TEMPORARY TABLE TEMP_TABLA
ON COMMIT PRESERVE ROWS
AS SELECT * FROM TABLA_EXISTENTE WHERE 1=0;


Insertando dinamicamente en la tabla temporal:
Un stored procedure que recorre una tabla LIST_TABLAS que contiene en su columna NOM_TABLA el nombre de tabla existente de la cual se extraeran los datos a insertar en la tabla temporal.Recordar que la tabla temporal es identica a la tabla que se consultará por los datos.Finalmente se hace un select en la tabla temporal:


/*LA TABLA LIST_TABLAS tiene las columnas:
*NOM_TABLA y FECHA_CREACION*/

CREATE OR REPLACE PROCEDURE SP_INSERTINTEMTABLA
(
fechaIni IN DATE,
fechaFin IN DATE,
curQuery IN OUT SYS_REFCURSOR
)
AS
querySQL varchar2(1000) :=''; nomTabla varchar2(100) := '';
cursor_ Integer; numeroMovidos INTEGER;
CURSOR CUR_LIST_TABLA IS
SELECT NOM_TABLA FROM LIST_TABLA WHERE TRUNC(FECHA_CREACION) BETWEEN TRUNC(fechaIni) AND TRUNC(fechaFin);
BEGIN
FOR TA IN CUR_LIST_TABLA
LOOP
nomTabla := LTRIM(RTRIM(TA.NOM_TABLA));
querySQL := 'INSERT INTO TEMP_TABLA ' || 'SELECT * FROM ' || nomTabla;
cursor_ := dbms_sql.open_cursor;
dbms_sql.parse (cursor_, querySQL, dbms_sql.native);
numeroMovidos := dbms_sql.execute (cursor_);
dbms_sql.close_cursor (cursor_);
END LOOP;
OPEN curQuery FOR
SELECT * FROM TEMP_TABLA;
END;

martes, 2 de marzo de 2010

Cómo saber si es Insert o Update Trigger AFTER INSERT,UPDATE - SQL SERVER

Se tien dos tablas:Empleado y Empleado_Log, se quiere que cada vez que se haga un cambio o una nueva inserción de registro en la tabla Empleado se guarde el nuevo registro o el modificado en la tabla Empleado_Log se debe especificar si fue un insert o un update en una de las columnas, la cual en este ejemplo se llama: "accion".

Ejemplo:


--TABLAS:
create table Empleado(
id int not null,
nombre varchar(20),
apellido varchar(20),
edad int,
editable varchar(2)
)
--tabla log
create table Empleado_Log(
idEmpleado int,
nombre varchar(20),
apellido varchar(20),
edad int,
editable varchar(2),
accion varchar(20)
)

--trigger que se disparará cuando se haga un insert o un update
create trigger trg_Example
on Empleado
after insert,update
as
begin
declare
@idEmp int,
@nombre varchar(20),
@apellido varchar(20),
@edad int,
@editable varchar(2),
@accion varchar (20)

select @idEmp=id,@nombre=nombre,@apellido=apellido,@edad=edad,
@editable=editable
from inserted
begin
--Si hay valores en la tabla deleted y además todos(excepto
--editable y id) son diferentes a los nuevos valores insertados,
--significa que ha habido un update
if exists(select * from deleted d join inserted i on
d.id=i.id where d.nombre != i.nombre or
d.apellido != i.apellido or d.edad != i.edad)
begin
set @accion ='record updated'
insert into Empleado_Log values(@idEmp,@nombre,@apellido,
@edad,@editable,@accion)
end
--Si no ha habido un update hay valores sólo en la tabla inserted
--y eso significa que ha habido un insert.No se debe olvidar
--que un update es un delete y un insert.
else if exists(select id from inserted)
and not exists(select id from deleted)
begin
set @accion ='record inserted'
insert into Empleado_Log values(@idEmp,@nombre,@apellido,
@edad,@editable,@accion)
end
end
end

--probando
insert into Empleado values (1,'pedro','sanchez',30,'si')

insert into Empleado values (2,'Luis','Perez',32,'no')

update Empleado set nombre='josse',apellido='diaz',
edad=21,editable='si' where id=1

update Empleado set nombre='Juan' where id=2

delete from Empleado_Log

select * from Empleado_Log

--borrando tablas y trigger
drop table Empleado_Log
drop table Empleado
drop trigger trg_Example

domingo, 1 de noviembre de 2009

MySQL (en Ubuntu) - Guía rápida

Nota:
Toda sentencia en MySQL debe terminar con un punto y coma (;).
El símbolo $ indica el símbolo de comando del interprete de comandos; por ejemplo,
en Windows es c:\>.El símbolo mysql> es el símbolo de comandos de MySQL. No se deben escribir con el comando ya que son auto-generados, al igual que el símbolo -> .

Instalación:
$sudo apt-get install mysql-server-5.1
Durante la instalación pedirá que se ingrese una contraseña para el root de mysql.
Vamos a crear una base de datos y un usuario con el que vamos a trabajar y que tendrá acceso a la nueva base de datos.
Para eso debemos conectarnos al servidor mysql mediante el comando:
$mysql -u nombredeusuario -p
Dado que en este momento sólo existe el usuario root; entonces, desde la consola o terminal escribimos el comando:
$mysql -u root -p
Nos pedirá la contraseña , así que la escribimos. Es de recordar que en la consola no aparecerá nada mientras escribimos la contraseña, así se evita que alguien más pueda verla.
Establecida la conexión aparecerá el símbolo de comandos:
mysql>
Creamos la nueva base de datos:


mysql>CREATE DATABASE newdb;

Creamos el usuario jlrvpuma y le damos permiso completo de acceso a la nueva base de datos newdb:


mysql>GRANT ALL ON newdb.* to jlrvpuma@localhost IDENTIFIED BY 'password';

Se ha creado al usuario “jlrvpuma” con contraseña “password” -puede ser cualquier cadena- y que tiene todos los permisos para la base de datos newdb y que se conectará a ella desde localhost.Si la conexión del cliente al servidor no fuera desde localhost, entonces se deberá cambiar localhost por el nombre del equipo pertinente.
A partir de este momento nos conectaremos a la base de datos con el usuario jlrvpuma:
$mysql -u jlrvpuma -p
Le indicamos a MySQL que vamos a utilizar la base de datos newdb:


mysql>USE newdb;


Creando una tabla:
Se usa la instrucción CREATE TABLE:


mysql> CREATE TABLE new_table(
-> user_id INT,
-> name VARCHAR(30),
-> last_name VARCHAR(40));


Visualizando tablas:
Se usa la instrucción SHOW TABLES :


mysql>SHOW TABLES;


Visualizando la estructura de una tabla:
Se usa la instrucción DECRIBE :


mysql>DESCRIBE new_table;


Insertando nuevos registros en una tabla:
Se utiliza la instrucción INSERT:


mysql> INSERT INTO new_table(user_id,name,last_name) VALUES(1,'Carlos','Villa');

También se puede hacer de una forma más sencilla:


mysql>INSERT INTO new_table VALUES(2,'Maritza','Rodriguez');

Pero se debe estar seguro del orden de los campos en la tabla, ya que se podría insertar datos en campos equivocados. Es recomendable usar la primera forma, de esa manera se reducen las posibilidades de errores, pues se puede apreciar el orden en que están siendo ingresados los campos.

Cambiando registros en una tabla:
Se usa instrucción UPDATE:


mysql>UPDATE new_table SET name='Yuri' WHERE user_id=2;


Eliminando registros en una tabla:
Se usa la instrucción DELETE:


mysql>DELETE FROM new_table WHERE user_id=4;

Se debe tener cuidado, ya que si no se especifica mediante WHERE qué registro debe ser eliminado, se borrarán todos los registros de la tabla.


Recuperando información de una tabla(o haciendo consultas):
Se usa la instrucción SELECT. Por ejemplo, si se quiere recuperar todos los campos, se usa el comodin *:


mysql> SELECT * FROM new_table;

O bien, si se quiere sólo algunos campos:


mysql> SELECT name,last_name FROM new_table;

usando la clausula WHERE:


mysql> SELECT name FROM new_table WHERE user_id=1;


Usando la instrucción LIKE y el comodín % :


mysql>SELECT * FROM new_table WHERE name LIKE 'Car%';

El símbolo % significa 0(cero) o más caracteres después de la cadena 'Car'.En otras palabras se recuperará los registros cuyo campo name empiece por 'Car'.
La instrucción :


mysql>SELECT * FROM new_table WHERE name LIKE '%r%';

recuperará todos los registros cuyo campo name empiece y termine por cualquier cadena pero que contenga la letra 'r'.
La instrucción :


mysql>SELECT * FROM new_table WHERE name LIKE 'M%a';

recuperará todos los registros cuyo campo name empiece con 'M' y termine en 'a'.

Usando la clausula ORDER BY:
También podemos combinar con la clausula ORDER BY para ordenar los resultado y podemos usar las palabras clave ASC y/o DESC para ordenar los resultados en orden ascendente o descendente respectivamente:


mysql> SELECT * FROM new_table ORDER BY name DESC;
mysql> SELECT * FROM new_table ORDER BY name ASC;

o bien:


mysql> SELECT * FROM new_table ORDER BY name ASC, last_name DESC;


Usando la instrucción DISTINCT :
Útil cuando tenemos valores repetidos en dos o más campos y queremos los resultados sin repeticiones:


mysql> SELECT DISTINCT name FROM new_table;

Usando la clausula LIMIT:
Permite limitar el numero de resultados o limite de fila, además permite establecer el desplazamiento; es decir el numero de fila desde dónde empezará a contar, la estructura sería mas o menos: LIMIT desplazamiento,límite de fila
La instrucción :


mysql>SELECT * FROM new_table LIMIT 1,2;

recuperará la segunda y tercera fila. El primer valor, a la izquierda de la coma, en la clausula LIMIT, se refiere al desplazamiento, en este ejemplo, al ser su valor 1, empezará a contar desde la segunda fila ya que se empieza a contar desde 0(cero). Se puede omitir el valor de desplazamiento, poniendo sólo el valor de la derecha o límite de fila, MySQL asumirá el valor 0(cero) como valor de desplazamiento predeterminado. La siguiente instrucción recuperará las dos primeras filas :


mysql>SELECT * FROM new_table LIMIT 2;


Usando funciones COUNT(), MAX(), MIN(),SUM(),AVG():
Para obtener el número de filas o registros:


mysql> SELECT COUNT(name) FROM new_table;

O bien si se quiere saber cuantos nombres diferentes hay:


mysql> SELECT COUNT(DISTINCT name) FROM new_table;


Para recuperar el mayor valor de un campo:


mysql> SELECT MAX(user_id) FROM new_table;



Para recuperar el menor valor de un campo:


mysql> SELECT MIN(user_id) FROM new_table;



Para recuperar la media :


mysql> SELECT AVG(user_id) FROM new_table;



Para recuperar el total de la suma de todos los valores de un campo:


mysql> SELECT SUM(user_id) FROM new_table;