miércoles, 21 de diciembre de 2011

cursores con parametros

Se deja un ejemplo de como pasar parametros a un cursor.

Este ejemplo saca de la base de datos todas las tablas y sus columnas.



DECLARE
vPropietario all_tables.owner%TYPE;
vNombreTabla all_tables.owner%TYPE;
vNombreColumna all_tab_columns.table_name%TYPE;
cursor obtieneTablas(pPropietario2 all_tables.owner%TYPE) is
select distinct t.owner, t.table_name
from all_tables t
where t.owner = pPropietario2;
/* Segundo cursor */
cursor obtieneColumnas(pPropietario all_tab_columns.column_name%TYPE, pNameTable all_tab_columns.table_name%TYPE) is
select distinct c.column_name
from all_tab_columns c
where c.owner = pPropietario
and c.table_name = pNameTable;
begin
vPropietario:='SYSTEM';
open obtieneTablas(vPropietario);
loop fetch obtieneTablas into vPropietario, vNombreTabla;
exit when obtieneTablas%NOTFOUND;
dbms_output.put_line('Tabla : ' vPropietario '.' vNombreTabla);
open obtieneColumnas(vPropietario, vNombreTabla) ;
loop fetch obtieneColumnas into vNombreColumna;
exit when obtieneColumnas%NOTFOUND;
dbms_output.put_line(chr(9)vNombreTabla'.'vNombreColumna);
end loop;
close obtieneColumnas;
end loop;
close obtieneTablas;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'Se ha detectado un error - 'SQLCODE' -ERROR- 'SQLERRM);
end;

viernes, 16 de diciembre de 2011

DDL / DML

Lenguaje de definición de datos (DDL)

El lenguaje de definición de datos (en inglés Data Definition Language, o DDL), es el que se encarga de la modificación de la estructura de los objetos de la base de datos. Incluye órdenes para modificar,borrar o definir las tablas en las que se almacenan las base de datos. Existen cuatro operaciones básicas: CREATE, ALTER, DROP y TRUNCATE.

CREATE
Este comando crea un objeto dentro de la base de datos. Puede ser una tabla, [[Vista 'CAMPO 2' STRING

Ejemplo (crear una función)
CREATE OR REPLACE FUNCTION 'NOMBRE FUNCION'('PARAMETROS')
RETURNS 'TIPO RETORNO' AS
$BODY$
BEGIN
'INSTRUCCIÓN SQL'
--por Ejemplo:
DELETE FROM con empleado WHERE id empleado = 'ANY' (ids);
END;
$BODY$
LANGUAGE 'plpgsql';

ALTER
Este comando permite modificar la estructura de un objeto. Se pueden agregar/quitar campos a una tabla, modificar el tipo de un campo, agregar/quitar índices a una tabla, modificar un trigger, etc.

Ejemplo (agregar columna a una tabla)
ALTER TABLE 'TABLA_NOMBRE' (
ADD NUEVO_CAMPO INT UNSIGNED meel
)

DROP
Este comando elimina un objeto de la base de datos. Puede ser una tabla, vista, índice, trigger, función, procedimiento o cualquier otro objeto que el motor de la base de datos soporte. Se puede combinar con la sentencia ALTER.

Ejemplo
ALTER TABLE ''TABLA_NOMBRE''
(
DROP COLUMN ''CAMPO_NOMBRE1''
)

TRUNCATE
Este comando trunca todo el contenido de una tabla. La ventaja sobre el comando DROP, es que si se quiere borrar todo el contenido de la tabla, es mucho más rápido, especialmente si la tabla es muy grande. La desventaja es que TRUNCATE sólo sirve cuando se quiere eliminar absolutamente todos los registros, ya que no se permite la cláusula WHERE. Si bien, en un principio, esta sentencia parecería ser DML (Lenguaje de Manipulación de Datos), es en realidad una DDL, ya que internamente, el comando TRUNCATE borra la tabla y la vuelve a crear y no ejecuta ninguna transacción.

Ejemplo
TRUNCATE TABLE ''TABLA_NOMBRE1''


Lenguaje de manipulación de datos DML(Data Manipulation Language)
Definición
Un lenguaje de manipulación de datos (Data Manipulation Language, o DML en inglés) es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios llevar a cabo las tareas de consulta o manipulación de los datos, organizados por el modelo de datos adecuado.
El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar y manipular datos en una base de datos relacional.

INSERT
Una sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en una base de datos relacional.

Forma básica
INSERT INTO ''tabla'' (''columna1'', [''columna2,... '']) VALUES (''valor1'', [''valor2,...''])
Las cantidades de columnas y valores deben ser iguales. Si una columna no se especifica, le será asignado el valor por omisión. Los valores especificados (o implícitos) por la sentencia INSERT deberán satisfacer todas las restricciones aplicables. Si ocurre un error de sintaxis o si alguna de las restricciones es violada, no se agrega la fila y se devuelve un error.

Ejemplo
INSERT INTO agenda_telefonica (nombre, numero) VALUES ('Roberto Jeldrez', 4886850);

Cuando se especifican todos los valores de una tabla, se puede utilizar la sentencia acortada:

INSERT INTO ''tabla'' VALUES (''valor1'', [''valor2,...''])

Ejemplo (asumiendo que 'nombre' y 'número' son las únicas columnas de la tabla 'agenda_telefonica'):

INSERT INTO agenda_telefonica VALUES ('Roberto Jeldrez', 080473968);

Formas avanzadas

Inserciones en múltiples filas
Una característica de SQL (desde SQL-92) es el uso de constructores de filas para insertar múltiples filas a la vez, con una sola sentencia SQL:

INSERT INTO ''tabla'' (''columna1'', [''columna2,... ''])
VALUES (''valor1a'', [''valor1b,...'']), (''value2a'', [''value2b,...'']),...

Esta característica es soportada por DB2, PostgreSQL (desde la versión 8.2), MySQL, y H2.
Ejemplo (asumiendo que 'nombre' y 'número' son las únicas columnas en la tabla 'agenda_telefonica'):

INSERT INTO agenda_telefonica VALUES ('Roberto Fernández', '4886850'), ('Alejandro Sosa', '4556550');

Que podía haber sido realizado por las sentencias
INSERT INTO agenda_telefonica VALUES ('Roberto Fernández', '4886850');
INSERT INTO agenda_telefonica VALUES ('Alejandro Sosa', '4556550');

Notar que las sentencias separadas pueden tener semántica diferente (especialmente con respecto a los triggers), y puede tener diferente rendimiento que la sentencia de inserción múltiple.

Para insertar varias filas en MS SQL puede utilizar esa construcción:

INSERT INTO phone_book
SELECT 'John Doe', '555-1212'
UNION ALL
SELECT 'Peter Doe', '555-2323';

Tenga en cuenta que no se trata de una sentencia SQL válida de acuerdo con el estándar SQL (SQL: 2003), debido a la cláusula subselect incompleta.

Para hacer lo mismo en Oracle se usa DUAL TABLE, siempre que se trate de solo una simple fila:
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM DUAL
UNION ALL
SELECT 'Peter Doe','555-2323' FROM DUAL

Una implementación conforme al estándar de esta lógica se muestra el siguiente ejemplo, o como se muestra arriba (no aplica en Oracle):

INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'Peter Doe','555-2323' FROM LATERAL ( VALUES (1) ) AS t(c)]
Copia de filas de otras tablas

Un INSERT también puede utilizarse para recuperar datos de otros, modificarla si es necesario e insertarla directamente en la tabla. Todo esto se hace en una sola sentencia SQL que no implica ningún procesamiento intermedio en la aplicación cliente. Un SUBSELECT se utiliza en lugar de la cláusula VALUES. El SUBSELECT puede contener JOIN, llamadas a funciones, y puede incluso consultar en la misma TABLA los datos que se inserta. Lógicamente, el SELECT se evalúa antes que la operación INSERT esté iniciada. Un ejemplo se da a continuación.

INSERT INTO phone_book2
SELECT *
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')

Una variación es necesaria cuando algunos de los datos de la tabla fuente se está insertando en la nueva tabla, pero no todo el registro. (O cuando los esquemas de las tablas no son iguales.)

INSERT INTO phone_book2 ( [name], [phoneNumber] )

SELECT [name], [phoneNumber]
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')

El SELECT produce una tabla (temporal), y el esquema de la tabla temporal debe coincidir con el esquema de la tabla donde los datos son insertados.]

UPDATE
Una sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros existentes en una tabla.

Ejemplo
UPDATE My_table SET field1 = 'updated value asd' WHERE field2 = 'N';

DELETE
Una sentencia DELETE de SQL borra uno o más registros existentes en una tabla.
Forma básica
SQL="DELETE FROM ''tabla'' WHERE ''columna1'' = ''valor1''"

Ejemplo
DELETE FROM My_table WHERE field2 = 'N';

material subido de las clases

se adjunta material para estudio

Funciones Oracle
http://dl.dropbox.com/u/48460562/Funciones_Oracle.pdf

ORACLE PL/SQL
http://dl.dropbox.com/u/48460562/Oracle_PL-SQL.pptx

Mejores Practicas
http://dl.dropbox.com/u/48460562/mejores_practicas_plsql.docx

ORACLE_DML
http://dl.dropbox.com/u/48460562/SQL_DML.ppt

sábado, 10 de diciembre de 2011

Clase 10/12/2011

Creación de Tablas


inserción de Datos





en la pagina 7 de la guia entregada el comentario esta erroneo, en SQL el comentarios es:





una linea --


más de una linea /* comentarios */








utilizacion de PL/SQL





create table t1 (e integer, f integer);


insert into t1 values (1,3);


insert into t1 values (2,4);






declare
a t1.e%TYPE;
b t1.f%TYPE;
begin
select e,f into a,b from t1 where e> 1;
insert into t1 values (b,a);
commit;
end;
select * from t1


CONDICIONES

IF

ejemplo

declare
a t1.e%TYPE;
b t1.f%TYPE;
cont number:=0;
begin
select count(*) into cont from t1 where e>1;
if (cont > 1) then
dbms_output.put_line('Existe más de un registro');
elsif cont = 0 then
dbms_output.put_line('No hay Datos');
insert into t1 values (2,4);
commit;
else
select e,f into a,b from t1 where e> 1;
dbms_output.put_line('Inserto');
insert into t1 values (b,a);
commit;
end if;
end;


LOOP


begin
fecha:=trunc(sysdate);
loop
if to_char(fecha,'mm') = '12' then
dbms_output.put_line('Año ' fecha);
end if;
fecha:=add_months(fecha, 1);
exit when fecha > to_date('31/12/2020','dd/mm/yyyy');
end loop;
end;

viernes, 9 de diciembre de 2011

TRABAJO BUENAS PRACTICAS PL/SQL

Integrantes
Victor Gonzalez.
Luis Fuentes.
Boris Velasquez.


 
Para indagar más en el tema ponemos a su disposición material encontrado en la web.



Clase Viernes 09

/*==============================================================*/
/* Tabla: Persona*/
/*==============================================================*/
create
ID
table PERSONA( integer,NOMBRE VARCHAR(35),APELLIDO VARCHAR(40),FECHANAC DATE,RENTA
constraint
);
NUMBER (5,1), PK_PERSONA primary key (ID)Select * from tab/*==============================================================*/
/* Ingreso de datos */
/*==============================================================*/
insert into PERSONA values('2','Victor','Gonzalez','1-12-1977','100');desc PERSONACREATE
SEQUENCE SeqPERSONASTART WITH 1INCREMENT BY 1;SELECT FROM SeqPERSONA.NEXTVAL;
SELECT seqPERSONA.NEXTVAL FROM PERSONA;

Clases Sabado

Modulos               Sala
1_________        A302
2_________        A302
3_________
4_________        A301
5_________        A301