lunes, 28 de marzo de 2011

Actualizar y Contar

declare
a empleado.cantidad%TYPE;
b empleado.numempleado%TYPE;

cursor Actualizar is select numempleado,count(*)
from propiedad
group by numempleado;

begin
open Actualizar ;
loop
fetch Actualizar into b,a;
update empleado set cantidad = a where numempleado = b;
dbms_output.put_line('ACualizado :'||b ||a);
exit when Actualizar%NOTFOUND;
end loop;
CLOSE Actualizar;
end;

jueves, 24 de marzo de 2011

Agregue un atributo a la tabla EMPLOYEES, denominado TipoId, que va a contener un string.

Desarrolle un cursor que permita completar dicho atributo de acuerdo al siguiente criterio:

SI employee_id es Par

Entonces

TipoId = ‘PAR’

Si-no

TipoId = ‘IMPAR’

---------------------------------------------------------------------------------------
ALTER TABLE employees
MODIFY TipoId Varchar(10);



declare
vEmployee_id employees.employee_id%TYPE;
vTipo employees.first_name%TYPE;



cursor parImparCursor is
select employee_id
from employees for update;



begin
open parImparCursor;
loop
fetch parImparCursor into vEmployee_id;
IF MOD(vEmployee_id,2)=0 THEN
update employees set idtipo ='par' where MOD(Employee_id,2)=0 ;
dbms_output.put_line(vEmployee_id||' PAR ');
ELSE
dbms_output.put_line(vEmployee_id||' IMPAR ');
update employees set idtipo = 'impar';
END IF;
exit when parImparCursor%NOTFOUND;
end loop;
CLOSE parImparCursor;
end;
---------------------------------------------------------------------------------------
DECLARE
vEmployee_id employees.employee_id%TYPE;
CURSOR parImparCursor IS
SELECT EMPLOYEE_ID
from employees for UPDATE;
BEGIN
OPEN parImparCursor;
LOOP FETCH parImparCursor INTO vEmployee_id;
EXIT when parImparCursor%NOTFOUND;
dbms_output.put_line(vEmployee_id);
END LOOP;
CLOSE parImparCursor;
END;

lunes, 21 de marzo de 2011

1.-Explicación a lo que ocurre al ejecutar nuevamente el procedimiento anónimo (página 10)

Al ejecutar neuvamente la misma sentencia me indica que

ORA-01422: la recuperación exacta devuelve un número mayor de filas que el solicitado
 
 

viernes, 18 de marzo de 2011

Para conectar a  la base de datos :
1.       Establecer parámetros de la conexión
·         User
·         Password
·         Driver
·         url
2.       Levantar al driver
Class.forName(driver);
3.       Establecer la conexión
4.       Definir la consulta
5.       Preparo la sentencia que voy a utilizar
Pstm = con.prepareStatement(sql);
6.       Ejecuto la sentencia
Rs = pstm.executeQuery();
7.       Mostrar resultados
While(rs.next())
System.out.println(rs.getString(“nombre”));

jueves, 17 de marzo de 2011

Curso Básico de Pl Sql Oracle

http://www.slideshare.net/luisguil/curso-bsico-de-pl-sql-oracle

Investigar funciones para manipular fechas.

Aqui algunos ejemplos para adicionar y sustraer días y meses y encontrar la diferencia entre fechas en Oracle. Estos ejemplos toman el resultado de la tabla "dual. La tabla Dual es una tabla virtual que existe en todas las Bases de datos Oracle. Muchas veces hemos usado la consulta SELECT sysdate FROM dual; la cual simplemente nos retorna la fecha y hora actual.

Ajustar meses y años

Para trabajar con meses y años (cada uno de los cuales puede variar en número de días) Oracle ofrece la función numtoyminterval. Esta trabaja en forma similar a la función numtodsinterval mencionada antes tomando un numero y una cadena string. Las opciones válidas para esta función son: ‘YEAR’ or ‘MONTH’.
SQL> SELECT to_char(sysdate + numtoyminterval(5, 'MONTH'), 'MM/DD/YYYY') FROM dual;

SQL> SELECT to_char(sysdate + numtoyminterval(2, 'YEAR'), 'MM/DD/YYYY') FROM dual;


Comparar fechas

Suponga que deseamos comparar algunas fechas y encontrar el numero de días entre ellas. Para ver este resultado en días, simplemente basta con usar el operador -, de la siguiente manera:
SQL> SELECT TO_DATE('11/04/2006', 'MM/DD/YYYY') - sysdate FROM dual;
TO_DATE('11/04/2006','MM/DD/YYYY')-SYSDATE
------------------------------------------
46,3796528
El resultado es expresado en días, incluyendo horas fraccion de horas. Por supuesto si se desea semanas, se podría dividir el resultado entre 7. De manera similar, si se desea obtener horas, se debería multiplicar por 24, pero si se desea meses, entonces se podría usar la función months_between.
SQL> SELECT months_between(sysdate, to_date('01/01/2006', 'MM/DD/YYYY')) FROM dual;
MONTHS_BETWEEN(SYSDATE,TO_DATE('01/01/2006','MM/DD/YYYY'))
----------------------------------------------------------
8,56846625


Retornar la mayor y menor fecha dentro de un conjunto

Las funciones greatest y least pueden ser usadas en fechas para retornar la menor o la mayor fecha.
SQL> SELECT greatest(sysdate,sysdate+1, to_date('09/11/2005','MM/DD/YYYY'), to_date('12/25/2005','MM/DD/YYYY'))FROM dual;
GREATEST
--------
19/09/06
SQL> SELECT least(sysdate,sysdate+1,to_date('09/11/2005','MM/DD/YYYY'), to_date('12/25/2005','MM/DD/YYYY'))FROM dual;
LEAST(SY
--------
11/09/05


Cual es el último día de este mes?


La función last_day retorna el último día del mes pasado como parámetro.
SQL> select last_day(sysdate) from dual;
LAST_DAY
--------
30/09/06


Siguiente día de la semana despues de una fecha


La función next_day retorna la fecha de la próxima ocurrencia de un día de la semana(’Monday’, ‘Tuesday’, etc.) después de una fecha dada. ejemplo: consultar la fecha del próximo domingo:
SQL> select next_day(sysdate,'Domingo') from dual;
NEXT_DAY
--------
24/09/06


Ajustar Dias, Semanas, Horas y minutos


Para adicionar y sustraer días a una fecha, simplemente usamos los signos + o - respectivamente. Algunos ejemplos:
SQL> SELECT sysdate + 7 FROM dual;
SYSDATE+
-------
25/09/06
SQL> SELECT sysdate - 30 FROM dual;
SYSDATE-
--------
19/08/06
SQL> SELECT to_char(sysdate - 14, 'MM/DD/YYYY HH:MI AM') FROM dual;
TO_CHAR(SYSDATE-14,
-------------------
09/04/2006 11:41 AM
En el primer ejemplo, vemos que la consulta retorna la fecha siete días apartir de hoy. La segunda retorna la fecha de hace 30 días. En la tercera, se ha usado la función de conversión to_char, para ver las horas y minutos. Esto nos muestra que mientras la fecha, ha cambiado, el tiempo no cambia.
Los ejemplos primero y tercero ademas muestran como el adicionar días, puede ser útil para computar semanas. Si ud desea simplificar el computo de semanas, podías usar querys de este tipo:
SQL> SELECT sysdate + (7 * 3) FROM dual;
SYSDATE+
--------
09/10/06
Así mismo, para trabajar con horas ud podría usar fracciones de día. La forma más simple para mostrar esto es dividiendo por 24, que es el numero de horas diarias. Aunque el parentesis no es necesario, permite evidenciar con más claridad la sentencia
Aqui, se muestra la hora actual y luego la hora actual mas dos horas:
SQL> SELECT to_char(sysdate, 'HH:MI AM') FROM dual;
TO_CHAR(
--------
02:00 PM
SQL> SELECT to_char(sysdate + (2/24), 'HH:MI AM') FROM dual;

TO_CHAR(
--------
04:00 PM

Una alternativa a este método es el uso de la función numtodsinterval. El anterioir ejemplo puede ser reescrito de la siguiente manera (la función numtodsinterval viene incorporada en la BD apartir de oracle 9i):
SQL> SELECT to_char(sysdate + numtodsinterval(2, 'HOUR'), 'HH:MI AM')
FROM dual;
TO_CHAR(
---
02:00 PM
Aquí la función numtodsinterval está haciendo el trabajo de dividir 2/24 horas. Las opciones válidas para esta función son: ‘DAY’, ‘HOUR’, ‘MINUTE’, o ‘SECOND’. Aquí un ejemplo usando ‘MINUTE’. Cuando se trabaja con minutos la función numtodsinterval es mucho más legible.
SQL> SELECT to_char(sysdate + numtodsinterval(45, 'MINUTE'), 'HH:MI AM')FROM dual;
TO_CHAR(
--------
03:19 PM

Existen por supuesto más tipos de datos, la siguiente tabla los muestra:

Tipo de dato / SintáxisOracle 8iOracle 9iDescripción
dec(p, e)La precisión máxima es de 38 dígitos.La precisión máxima es de 38 dígitos.Donde p es la precisión y e la escala.

Por ejemplo:dec(3,1) es un número que tiene 2 dígitos antes del decimal y un dígito después del decimal.

decimal(p, e)La precisión máxima es de 38 dígitos.La precisión máxima es de 38 dígitos.Donde p es la precisión y e la escala.

Por ejemplo:decimal(3,1) es un número que tiene 2 dígitos antes del decimal y un dígito después del decimal.

double precision
float
int
integer
numeric(p, e)La precisión máxima es de 38 dígitos.La precisión máxima es de 38 dígitos.Donde p es la precisión y e la escala.

Por ejemplo:numeric(7,2) es un número que tiene 5 dígitos antes del decimal y 2 dígitos después del decimal.

number(p, e)La precisión máxima es de 38 dígitos.La precisión máxima es de 38 dígitos.Donde p es la precisión y e la escala.

Por ejemplo:number(7,2) es un número que tiene 5 dígitos antes del decimal y 2 dígitos después del decimal.

real
smallint
char (tamaño)Hasta 32767 bytes en PLSQL.

Hasta 2000 bytes en Oracle 8i.

Hasta 32767 bytes en PLSQL.

Hasta 2000 bytes en Oracle 9i.

Donde tamaño es el número de caracteres a almacenar. Son cadenas de ancho fijo. Se rellena con espacios.
varchar2 (tamaño)Hasta 32767 bytes en PLSQL.

Hasta 4000 bytes en Oracle 8i.

Hasta 32767 bytes en PLSQL.

Hasta 4000 bytes en Oracle 9i.

Donde tamaño es el número de caracteres a almacenar. Son cadenas de ancho variable.
longHasta 2 gigabytes.Hasta 2 gigabytes.Son cadenas de ancho variable.
rawHasta 32767 bytes en PLSQL.

Hasta 2000 bytes en Oracle 8i.

Hasta 32767 bytes en PLSQL.

Hasta 2000 bytes en Oracle 9i.

Son cadenas binarias de ancho variable.
long rawHasta 2 gigabytes.Hasta 2 gigabytes.Son cadenas binarias de ancho variable.
dateUna fecha entre el 1 de Enero de 4712 A.C. y el 31 de Diciembre de 9999 D.C.Una fecha entre el 1 de Enero de 4712 A.C. y el 31 de Diciembre de 9999 D.C.
timestamp (fractional seconds precision)No soportado por Oracle 8i.fractional seconds precision debe ser un número entre 0 y 9. (El valor por defecto es 6)Incluye año, mes día, hora, minutos y segundos.

Por ejemplo:timestamp(6)

timestamp (fractional seconds precision) with time zoneNo soportado por Oracle 8i.fractional seconds precision debe ser un número entre 0 y 9. (El valor por defecto es 6)Incluye año, mes día, hora, minutos y segundos; con un valor de desplazamiento de zona horaria.

Por ejemplo:timestamp(5) with time zone

timestamp (fractional seconds precision) with local time zoneNo soportado por Oracle 8i.fractional seconds precision debe ser un número entre 0 y 9. (El valor por defecto es 6)Incluye año, mes día, hora, minutos y segundos; con una zona horaria expresada como la zona horaria actual.

Por ejemplo:timestamp(4) with local time zone

interval year (year precision) to monthNo soportado por Oracle 8i.year precision debe ser un número entre 0 y 9. (El valor por defecto es 2)Período de tiempo almacenado en años y meses.

Por ejemplo: interval year(4) to month

interval day (day precision) to second (fractional seconds precision)No soportado por Oracle 8i.day precision debe ser un número entre 0 y 9. (El valor por defecto es 2)

fractional seconds precision debe ser un número entre 0 y 9. (El valor por defecto es 6)

Incluye año, mes día, hora, minutos y segundos.

Por ejemplo: interval day(2) to second(6)

rowidEl formato del campo rowid es:

BBBBBBB.RRRR.FFFFF donde BBBBBBB es el bloque en el fichero de la base de datos; RRRR es la fila del bloque; FFFFF es el fichero de la base de datos.

El formato del campo rowid es:

BBBBBBB.RRRR.FFFFF donde BBBBBBB es el bloque en el fichero de la base de datos; RRRR es la fila del bloque; FFFFF es el fichero de la base de datos.

Datos binarios de ancho fijo. Cada registro de la base de datos tiene una dirección física o rowid.
urowid [tamaño]Hasta 2000 bytes.Hasta 2000 bytes.Rowid universal. Donde tamaño es opcional.
booleanVálido en PLSQL, este tipo de datos no existe en Oracle 8i.Válido en PLSQL, este tipo de datos no existe en Oracle 9i.
nchar (tamaño)Hasta 32767 bytes en PLSQL. Hasta 2000 bytes en Oracle 8i.Hasta 32767 bytes en PLSQL. Hasta 2000 bytes en Oracle 9i.Donde tamaño es el número de caracteres a almacenar. Cadena NLS de ancho fijo.
nvarchar2 (tamaño)Hasta 32767 bytes en PLSQL. Hasta 4000 bytes en Oracle 8i.Hasta 32767 bytes en PLSQL. Hasta 4000 bytes en Oracle 9i.Donde tamaño es el número de caracteres a almacenar. Cadena NLS de ancho variable.
bfileHasta 4 gigabytes.Hasta 4 gigabytes.Localizadores de archivo apuntan a un objeto binario de sólo lectura fuera de la base de datos.
blobHasta 4 gigabytes.Hasta 4 gigabytes.Localizadores LOB apuntan a un gran objeto binario dentro de la base de datos.
clobHasta 4 gigabytes.Hasta 4 gigabytes.Localizadores LOB apuntan a un gran objeto de caracteres dentro de la base de datos.
nclobHasta 4 gigabytes.Hasta 4 gigabytes.Localizadores LOB apuntan a un gran objeto NLS de caracteres dentro de la base de datos.

HEXTORAW:
INSERT INTO raw_table(raw_column) VALUES (HAXTORAW('017D3F');

CHARTOROWID:
SELECT per_nom from consolida_mes
where rowid = CHARTOROWID('AAAAenAAIAAAAdVVAAX');

RAWTOHEX:
SELECT rawtohex(raw_column) from raw_table;

ROWIDTOCHAR:
select rowidtochar(rowid) from consolida_mes
where rownum = 1;

TO_CHAR:
select to_char(sysdate,'dd/mm/yyyy') from dual;

TO_DATE:
select to_date('19/03/2011', 'dd/mm/yyyy') from dual;

TO_NUMBER:
select to_number('$123.45','$199.99') from dual;

Funciones de conversión entre tipos de datos.

Funciones integrada de conversión

Name

Description

CHARTOROWID

Convierte una cadena a un ROWID.

CONVERT

Convierte una cadena a partir de un conjunto de caracteres a otro.

HEXTORAW

Convierte de hexadecimal a formato RAW.

RAWTOHEX

Convierte el valor de la prima a hexadecimal.

ROWIDTOCHAR

Convierte un valor binario ROWID a una cadena de caracteres.

TO_CHAR

Convierte un número o una fecha en una cadena.

TO_DATE

Convierte una cadena a una fecha.

TO_NUMBER

Convierte una cadena en un número.

The Built-In Conversion Functions



Name

Description

CHARTOROWID

Converts a string to a ROWID.

CONVERT

Converts a string from one character set to another.

HEXTORAW

Converts from hexadecimal to raw format.

RAWTOHEX

Converts from raw value to hexadecimal.

ROWIDTOCHAR

Converts a binary ROWID value to a character string.

TO_CHAR

Converts a number or date to a string.

TO_DATE

Converts a string to a date.

TO_NUMBER

Converts a string to a number.


Tipos de datos en PL/SQL

Cada constante y variable tien un tipo de dato en el cual se especifica el formato de almacenamiento, restricciones y rango de valores validos.

PL/SQL proporciona una variedad predefinida de tipos de datos . Casi todos los tipos de datos manejados por PL/SQL son similares a los soportados por SQL. A continuación se muestran los TIPOS de DATOS más comunes:

  • NUMBER (Numérico): Almacena números enteros o de punto flotante, virtualmente de cualquier longitud, aunque puede ser especificada la precisión (Número de digitos) y la escala que es la que determina el número de decimales.

    -- NUMBER [(precision, escala)]
    saldo NUMBER(16,2);
    /* Indica que puede almacenar un valor numérico de 16
    posiciones, 2 de ellas decimales. Es decir, 14 enteros
    y dos decimales */

  • CHAR (Caracter): Almacena datos de tipo caracter con una longitud maxima de 32767 y cuyo valor de longitud por default es 1


    -- CHAR [(longitud_maxima)]
    nombre CHAR(20);
    /* Indica que puede almacenar valores alfanuméricos de 20
    posiciones */

  • VARCHAR2 (Caracter de longitud variable): Almacena datos de tipo caracter empleando sólo la cantidad necesaria aún cuando la longitud máxima sea mayor.



    -- VARCHAR2 (longitud_maxima)

    nombre VARCHAR2(20);
    /* Indica que puede almacenar valores alfanuméricos de hasta 20
    posicones */
    /* Cuando la longitud de los datos sea menor de 20 no se
    rellena con blancos */

  • BOOLEAN (lógico): Se emplea para almacenar valores TRUE o FALSE.


    hay_error BOOLEAN;

  • DATE (Fecha): Almacena datos de tipo fecha. Las fechas se almacenan internamente como datos numéricos, por lo que es posible realizar operaciones aritmeticas con ellas.
  • Atributos de tipo. Un atributo de tipo PL/SQL es un modificador que puede ser usado para obtener información de un objeto de la base de datos. El atributo %TYPE permite conocer el tipo de una variable, constante o campo de la base de datos. El atributo %ROWTYPE permite obtener los tipos de todos los campos de una tabla de la base de datos, de una vista o de un cursor.
  • PL/SQL también permite la creación de tipos personalizados (registros) y colecciones(tablas de PL/SQL), que veremos en sus apartados correspondientes.

lunes, 14 de marzo de 2011

DECLARE
var_contador      NUMBER;
BEGIN
   FOR var_contador IN 1..100 LOOP
      dbms_output.put_line('Hola Mundo.');
   END LOOP;
END;

oracle database express edition

CRUD

En programación informática, crear, leer, actualizar y eliminar (CRUD) son las cuatro funciones básicas de almacenamiento persistente . [ 1 ] A veces CRUD se amplía con las palabras recuperaren lugar de leer o destruir en vez de eliminar . A veces también se utiliza para describir la interfaz de usuario convenciones que facilitan la visualización, búsqueda, y el cambio de la información , a menudo utilizando equipo basado en las formas y los informes . El término fue popularizado por primera vez probablemente por James Martin en 1983 un libro titulado "Gestión de los datos-base para 

Integrantes

Mario Montiel
Maximiliano Contreras
Armando Rodriguez

Control Diagnostico

Bases de Datos

 

 









Utilizando las tablas detalladas en la base de datos DreamHome descritas en la figura 1, resuelva las siguientes consultas.

Figura 1 – DreamHome

I.    Indique la secuencia en que deben ser pobladas las tablas del sistema DreamHome.
·         Empleado
·         Oficina
·         Propiedad
·         Propietario
·         Cliente
·         Visita
·         Arriendo










II.    Para las consultas SQL indicadas, describir a que corresponde el resultado (indicar si la consulta es válida sintacticamente).

1)     . Select nombre, salario, cargo
From empleado
Where salario >= all (select salario
         From empleado)

R: Consulta Buena .
Selecciona el nombre, salario y cargo del empleado que el salario sea mayor o igual al salario de los empleados.

2)     Select numempleado, nombre, apellido, numOficina
From empleado
Where numempleado not in (select numempleado
                                                                         From propiedad)
  R : Consulta Buena.
Selecciona el numero de empleado , el nombre, apellido y el numero de oficina del empleado donde el numero del empleado no esta en la tabla propiedad.


3)     select numoficina, count(*)
from empleado inner join oficina using (numoficina)
group by numoficina
having count (*) >3

R: Consulta falsa.


4)     Update Empleado
Set salario = salario*1,2
having cargo = 'Asistente'

R: Consulta falsa.



III.    Desarrollar las consultas que se indican a continuación

5)     Listar las mujeres, cuyo apellido comience con B y administren al menos una propiedad, mostrando nombre, apellido y salario.

Select nombre, apellido, salario
from Empleado Inner join propiedad
on empleado.numempleado = propiedad.numempleado
where apellido like ‘B%’ and sexo = ’Femenino’ ;

6)     Listar las mujeres, cuyo salario sea mayor al de algún hombre, mostrando nombre, apellido y salario.

Select nombre, apellido, salario
from empleado where salario > (select min (salario) from empleado where sexo =’masculino’) and sexo = ‘Femenino’;

7)         Listar los empleados que tienen el mismo nombre, indicando nombre y el numEmpleado.

8)     Listar todas las propiedades que han sido visitadas durante el mes de junio de 2007.

Select numpropiedad from propiedad inner join visita on propiedad.numpropiedad = visita.numpropiedad where datepart ( fecha, dp_month ) = 6 and datepart ( fecha, dp_year ) = 2007;

9)     Determinar los registros duplicados de la tabla propietario, es decir que tengan el mismo nombre y el mismo apellido.


10)   Escribir los comandos necesarios para crear la siguiente tabla:

Tabla Categoria

LLave
Nombre columna
Tipo Dato
Largo
Constraints
PK
IdCcategoria
number
5
PK

nombreCategoria
Varchar2
50
NOT NULL Unique

numeroArtistas
number
10
Mayor o igual que 0

Create table categoria (
idCategoria number(5) primary key not null,
nombreCategoria varchar2(50) Unique not null,
numeroArtistas number(10), 
CONSTRAINT chk_numeroArtistas (numeroArtistas  >= 0) );