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

PACKAGE MUESTRA BUSCAR DATOS

PACKAGE MUESTRA BUSCAR DATOS
CREATE OR REPLACE PROCEDURE get_emp_name (
   emp_number   IN  NUMBER,
   hire_date    OUT VARCHAR2,
   emp_name     OUT VARCHAR2) AS
BEGIN
   SELECT ename, to_char(hiredate, 'DD-MON-YY')
      INTO emp_name, hire_date
      FROM emp
      WHERE empno = emp_number;
END;

When get_emp_name is compiled on BOSTON_SERVER, its signature, as well as its timestamp, is recorded.
Suppose that on another server in California, some PL/SQL code calls get_emp_name identifying it using a DBlink called BOSTON_SERVER, as follows:
CREATE OR REPLACE PROCEDURE print_ename (emp_number IN NUMBER) AS
   hire_date    VARCHAR2(12);
   ename        VARCHAR2(10);
BEGIN
   get_emp_name@BOSTON_SERVER(emp_number, hire_date, ename);
   dbms_output.put_line(ename);
   dbms_output.put_line(hire_date);
END;

PACKAGE CON ERRORES SQL

PACKAGE CON ERRORES SQL

CREATE TABLE PAISES
(
  CODPA NUMBER(3, 0) NOT NULL
, NOMPA VARCHAR2(20 BYTE)
, CONPA VARCHAR2(10 BYTE)
, POBLPA VARCHAR2(20 BYTE)
);




CREATE OR REPLACE PACKAGE BODY buscar_pais AS 
  
   PROCEDURE buscar_por_cod(CODPA.id%TYPE) IS
   busqueda paises.NOMMPA%TYPE;
   BEGIN
      SELECT NOMPA INTO  busqueda
      FROM paises
      where id = NOMPA;
      dbms_output.put_line('Paises: '|| busqueda);
   END buscar_por_cod;

END buscar_pais 

AREA DEL TRIANGULO

AREA DEL TRIANGULO
create or replace function area_triangulo(base real,altura real)
return real as area real;
begin
area:=base*altura/2;
return area;
exception
when zero_divide then
dbms_output.put_line('No se puede dividir por Zero');
return area;
end;

PACK SUMA RESTA MULTIPLICAR DIVIDIR SQL ORACLE

PACK SUMA RESTA MULTIPLICAR DIVIDIR SQL ORACLE

PACK EN ORACLE SQL PARA SUMAR, RESTAR, MULTIPLICAR, DIVIDIR




create or replace function suma(a real,b real)
return real as salida real;
begin
salida:=a+b;
return salida;
exception when others then
dbms_output.put_line('ERROR NO SE PUEDE!!');
return salida;
end;

create or replace function resta(a real,b real)
return real as salida real;
begin
salida:=a-b;
return salida;
exception when others then
dbms_output.put_line('ERROR NO SE PUEDE!!');
return salida;
end;

create or replace function mult(a real,b real)
return real as salida real;
begin
salida:=a*b;
return salida;
exception when others then
dbms_output.put_line('ERROR NO SE PUEDE!!');
return salida;
end;

create or replace function div(a real,b real)
return real as salida real;
begin
salida:=a/b;
return salida;
exception
when zero_divide then
dbms_output.put_line('No se puede dividir por CERO');
return salida;
end;

create or replace function raiz(a real)
return real as salida real;
begin
salida:=sqrt(a);
return salida;
end;


create or replace procedure calc(a real, b real)
as
begin
dbms_output.put_line('suma: ' ||suma(a,b));
dbms_output.put_line('resta: '||resta(a,b));
dbms_output.put_line('mult: ' ||mult(a,b));
dbms_output.put_line('div: ' ||div(a,b));
dbms_output.put_line('Raiz ' ||raiz(a));
end;

begin calc (4,5);end;

Declarar Cursores

Declarar Cursores
declare cursor cpaises
is
select codpa,nompa,conpa from paises;
copa number(3);
nopa varchar2(20);
contpa varchar2(10);
begin
  open cpaises;
  loop
   fetch cpaises into copa,nopa,contpa;
   exit when cpaises%notfound;
   dbms_output.put_line(cpaises%rowcount||' pais '||nopa);
  end loop;
  close cpaises;
end;

Taller De Cursores Resuelto

Taller De Cursores Resuelto
E J E R C I C I O S
CURSOR...IS...
1.- Ejemplos de creación de procedimientos con cursores.
1) Desarrollar un procedimiento que visualice los nombres de los países y cuantos registros fueron procesados.
create or replace procedure p_muestra_paises
as
cursor c_muestrap is select nompa from paises order by nompa;
nopa varchar2(20);
BEGIN
OPEN c_muestrap;
LOOP
   FETCH c_muestrap into nopa;
   dbms_output.put_line('Pais '||nopa);
   EXIT WHEN c_muestrap%NOTFOUND;
END LOOP;
dbms_output.put_line('Numero de registros procesados '||c_muestrap%ROWCOUNT);
CLOSE c_muestrap;
END p_muestra_paises;
set serveroutput on;
exec p_muestra_paises;
2) Adicione la columna Poblacion a la tabla PAISES. Codificar un procedimiento que muestre el nombre de cada país, población y el total de la población.

CREATE OR REPLACE PROCEDURE ver_emple_depart
AS
CURSOR c_emple IS
SELECT dnombre, COUNT(emp_no)
FROM emple e, depart d
WHERE d.dept_no = e.dept_no(+)
GROUP BY dnombre;
v_dnombre depart.dnombre%TYPE;
v_num_emple BINARY_INTEGER;
BEGIN
OPEN c_emple;
FETCH c_emple into v_dnombre, v_num_emple;
WHILE c_emple%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_dnombre||' * '||v_num_emple);
FETCH c_emple into v_dnombre,v_num_emple;
END LOOP;
CLOSE c_emple;
END ver_emple_depart;
3) Escribir un procedimiento que reciba una cadena y visualice el país que contenga esa cadena.
CREATE OR REPLACE PROCEDURE ver_emple_apell(
cadena VARCHAR2)
AS
cad VARCHAR2(10);
CURSOR c_emple IS
SELECT apellido, emp_no FROM emple
WHERE apellido LIKE cad;
vr_emple c_emple%ROWTYPE;
BEGIN
cad :='%'||cadena||'%';
OPEN c_emple;
FETCH c_emple INTO vr_emple;
WHILE (c_emple%FOUND) LOOP
DBMS_OUTPUT.PUT_LINE(vr_emple.emp_no||' * '
||vr_emple.apellido);
FETCH c_emple INTO vr_emple;
END LOOP;
DBMS_OUTPUT.PUT_LINE('NUMERO DE EMPLEADOS: '
|| c_emple%ROWCOUNT);
CLOSE c_emple;
END ver_emple_apell;
4) Escribir un programa que visualice el apellido y el salario de los cinco empleados que tienen el salario más alto.
CREATE OR REPLACE PROCEDURE emp_5maxsal
AS
CURSOR c_emp IS
SELECT apellido, salario FROM emple
ORDER BY salario DESC;
vr_emp c_emp%ROWTYPE;
i NUMBER;
BEGIN
i:=1;
OPEN c_emp;
FETCH c_emp INTO vr_emp;
WHILE c_emp%FOUND AND i<=5 LOOP
DBMS_OUTPUT.PUT_LINE(vr_emp.apellido ||
' * '|| vr_emp.salario);
FETCH c_emp INTO vr_emp;
i:=I+1;
END LOOP;
CLOSE c_emp;
END emp_5maxsal;

OPEN...FETCH...
2 .- Ejemplos de como como recorrer un cursor.
5) Codificar un programa que visualice los dos empleados que ganan menos de cada oficio.
CREATE OR REPLACE PROCEDURE emp_2minsal
AS
CURSOR c_emp IS
SELECT apellido, oficio, salario FROM emple
ORDER BY oficio, salario;
vr_emp c_emp%ROWTYPE;
oficio_ant EMPLE.OFICIO%TYPE;
i NUMBER;
BEGIN
OPEN c_emp;
oficio_ant:='*';
FETCH c_emp INTO vr_emp;
WHILE c_emp%FOUND LOOP
IF oficio_ant <> vr_emp.oficio THEN
oficio_ant := vr_emp.oficio;
i := 1;
END IF;
IF i <= 2 THEN
DBMS_OUTPUT.PUT_LINE(vr_emp.oficio||' * '
||vr_emp.apellido||' * '
||vr_emp.salario);
END IF;
FETCH c_emp INTO vr_emp;
i:=I+1;
END LOOP;
CLOSE c_emp;
END emp_2minsal;

6) Escribir un programa que muestre, en formato similar a las rupturas de control o secuencia vistas en SQL*plus los siguientes datos:
- Para cada empleado: apellido y salario.
- Para cada departamento: Número de empleados y suma de los salarios del departamento.
- Al final del listado: Número total de empleados y suma de todos los salarios.
CREATE OR REPLACE PROCEDURE listar_emple
AS
CURSOR c1 IS
SELECT apellido, salario, dept_no FROM emple
ORDER BY dept_no, apellido;
vr_emp c1%ROWTYPE;
dep_ant EMPLE.DEPT_NO%TYPE;
cont_emple NUMBER(4) DEFAULT 0;
sum_sal NUMBER(9) DEFAULT 0;
tot_emple NUMBER(4) DEFAULT 0;
tot_sal NUMBER(10) DEFAULT 0;
BEGIN
OPEN c1;
FETCH c1 INTO vr_emp;
IF c1%FOUND THEN
dep_ant := vr_emp.dept_no;
END IF;
WHILE c1%FOUND LOOP
/* Comprobación nuevo departamento y resumen */
IF dep_ant <> vr_emp.dept_no THEN
DBMS_OUTPUT.PUT_LINE('*** DEPTO: ' || dep_ant ||
' NUM. EMPLEADOS: '||cont_emple ||
' SUM. SALARIOS: '||sum_sal);
dep_ant := vr_emp.dept_no;
tot_emple := tot_emple + cont_emple;
tot_sal:= tot_sal + sum_sal;
cont_emple:=0;
sum_sal:=0;
END IF;
/* Líneas de detalle */
DBMS_OUTPUT.PUT_LINE(RPAD(vr_emp.apellido,10)|| ' * '
||LPAD(TO_CHAR(vr_emp.salario,'9,999,999'),12));

/* Incrementar y acumular */
cont_emple := cont_emple + 1;
sum_sal:=sum_sal + vr_emp.salario;
FETCH c1 INTO vr_emp;
END LOOP;
CLOSE c1;
IF cont_emple > 0 THEN
/* Escribir datos del último departamento */
DBMS_OUTPUT.PUT_LINE('*** DEPTO: ' || dep_ant ||
' NUM EMPLEADOS: '|| cont_emple ||
' SUM. SALARIOS: '||sum_sal);
dep_ant := vr_emp.dept_no;
tot_emple := tot_emple + cont_emple;
tot_sal:= tot_sal + sum_sal;
cont_emple:=0;
sum_sal:=0;
/* Escribir totales informe */
DBMS_OUTPUT.PUT_LINE(' ****** NUMERO TOTAL EMPLEADOS: '
||tot_emple ||
' TOTAL SALARIOS: '|| tot_sal);
END IF;
END listar_emple;
/* Nota: este procedimiento puede escribirse de forma que la visualización de los resultados resulte mas clara incluyendo líneas de separación, cabeceras de columnas, etcétera. Por razones didácticas no se han incluido estos elementos ya que pueden distraer y dificultar la comprensión del código. */
7) Desarrollar un procedimiento que permita insertar nuevos departamentos según las siguientes especificaciones:
Se pasará al procedimiento el nombre del departamento y la localidad.
El procedimiento insertará la fila nueva asignando como número de departamento la decena siguiente al número mayor de la tabla.
Se incluirá gestión de posibles errores.
CREATE OR REPLACE PROCEDURE insertar_depart(
nombre_dep VARCHAR2,
loc VARCHAR2)
AS
CURSOR c_dep IS SELECT dnombre
FROM depart WHERE dnombre = nombre_dep;
v_dummy DEPART.DNOMBRE%TYPE DEFAULT NULL;
v_ulti_num DEPART.DEPT_NO%TYPE;
nombre_duplicado EXCEPTION;
BEGIN
/* Comprobación de que el departamento no está duplicado */
OPEN c_dep;
FETCH c_dep INTO v_dummy;
CLOSE c_dep;
IF v_dummy IS NOT NULL THEN
RAISE nombre_duplicado;
END IF;
/* Captura del último número y cálculo del siguiente */
SELECT MAX(dept_no) INTO v_ulti_num FROM depart;

/* Inserción de la nueva fila */
INSERT INTO depart VALUES ((TRUNC(v_ulti_num, -1)+10)
, nombre_dep, loc);
EXCEPTION
WHEN nombre_duplicado THEN
DBMS_OUTPUT.PUT_LINE('Err. departamento duplicado');
RAISE;
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. Operación cancelada’);
END insertar_depart;

8) Escribir un procedimiento que reciba todos los datos de un nuevo empleado procese la transacción de alta, gestionando posibles errores.
CREATE OR REPLACE PROCEDURE alta_emp(
num emple.emp_no%TYPE,
ape emple.apellido%TYPE,
ofi emple.oficio%TYPE,
jef emple.dir%TYPE,
fec emple.fecha_alt%TYPE,
sal emple.salario%TYPE,
com emple.comision%TYPE DEFAULT NULL,
dep emple.dept_no%TYPE)
AS
v_dummy_jef EMPLE.DIR%TYPE DEFAULT NULL;
v_dummy_dep DEPART.DEPT_NO%TYPE DEFAULT NULL;
BEGIN
/* Comprobación de que existe el departamento */
SELECT dept_no INTO v_dummy_dep
FROM depart WHERE dept_no = dep;
/* Comprobación de que existe el jefe del empleado */
SELECT emp_no INTO v_dummy_jef
FROM emple WHERE emp_no = jef;
/* Inserción de la fila */
INSERT INTO EMPLE VALUES
(num, ape, ofi, jef, fec, sal, com, dep);
EXCEPTION
WHEN NO_DATA_FOUND THEN
IF v_dummy_dep IS NULL THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. Departamento inexistente');
ELSIF v_dummy_jef IS NULL THEN
RAISE_APPLICATION_ERROR(-20005,
'Err. No existe el jefe');
ELSE
RAISE_APPLICATION_ERROR(-20005,
'Err. Datos no encontrados(*)');
END IF;
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE
('Err.numero de empleado duplicado');
RAISE;
END alta_emp;

WHILE...FOUND...LOOP...
3 .- Ejemplos como procedimientos con cursores y parámetros de entrada.
9) Codificar un procedimiento reciba como parámetros un numero de departamento, un importe y un porcentaje; y suba el salario a todos los empleados del departamento indicado en la llamada. La subida será el porcentaje o el importe indicado en la llamada (el que sea más beneficioso para el empleado en cada caso empleado).
CREATE OR REPLACE PROCEDURE subida_sal1(
num_depar emple.dept_no%TYPE,
importe NUMBER,
porcentaje NUMBER)
AS
CURSOR c_sal IS SELECT salario,ROWID
FROM emple WHERE dept_no = num_depar;
vr_sal c_sal%ROWTYPE;
v_imp_pct NUMBER(10);
BEGIN
OPEN c_sal;
FETCH c_sal INTO vr_sal;
WHILE c_sal%FOUND LOOP
/* Guardar en v_imp_pct el importe mayor */
v_imp_pct :=
GREATEST((vr_sal.salario/100)*porcentaje,
v_imp_pct);
/* Actualizar */
UPDATE EMPLE SET SALARIO=SALARIO + v_imp_pct
WHERE ROWID = vr_sal.rowid;

FETCH c_sal INTO vr_sal;
END LOOP;
CLOSE c_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Err. ninguna fila actualizada');
END subida_sal1;

10) Escribir un procedimiento que suba el sueldo de todos los empleados que ganen menos que el salario medio de su oficio. La subida será de el 50% de la diferencia entre el salario del empleado y la media de su oficio. Se deberá asegurar que la transacción no se quede a medias, y se gestionarán los posibles errores.
CREATE OR REPLACE PROCEDURE subida_50pct
AS
CURSOR c_ofi_sal IS
SELECT oficio, AVG(salario) salario FROM emple
GROUP BY oficio;
CURSOR c_emp_sal IS
SELECT oficio, salario FROM emple E1
WHERE salario <
(SELECT AVG(salario) FROM emple E2
WHERE E2.oficio = E1.oficio)
ORDER BY oficio, salario FOR UPDATE OF salario;

vr_ofi_sal c_ofi_sal%ROWTYPE;
vr_emp_sal c_emp_sal%ROWTYPE;
v_incremento emple.salario%TYPE;

BEGIN
COMMIT;
OPEN c_emp_sal;
FETCH c_emp_sal INTO vr_emp_sal;
OPEN c_ofi_sal;
FETCH c_ofi_sal INTO vr_ofi_sal;
WHILE c_ofi_sal%FOUND AND c_emp_sal%FOUND LOOP
/* calcular incremento */
v_incremento :=
(vr_ofi_sal.salario - vr_emp_sal.salario) / 2;
/* actualizar */
UPDATE emple SET salario = salario + v_incremento
WHERE CURRENT OF c_emp_sal;
/* siguiente empleado */
FETCH c_emp_sal INTO vr_emp_sal;
/* comprobar si es otro oficio */
IF c_ofi_sal%FOUND and
vr_ofi_sal.oficio <> vr_emp_sal.oficio THEN
FETCH c_ofi_sal INTO vr_ofi_sal;
END IF;
END LOOP;
CLOSE c_emp_sal;
CLOSE c_ofi_sal;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
RAISE;
END subida_50pct;

11) Diseñar una aplicación que simule un listado de liquidación de los empleados según las siguientes especificaciones:
- El listado tendrá el siguiente formato para cada empleado:
**********************************************************************
Liquidación del empleado:...................(1) Dpto:.................(2) Oficio:...........(3)
Salario : ............(4)
Trienios :.............(5)
Comp. Responsabil :.............(6)
Comisión :.............(7)
------------
Total :.............(8)
**********************************************************************
- Donde:
1 ,2, 3 y 4 Corresponden al apellido, departamento, oficio y salario del empleado.
5 Es el importe en concepto de trienios. Cada trienio son tres años completos desde la fecha de alta hasta la de emisión y supone 5000 Ptas.
6 Es el complemento por responsabilidad. Será de 10000Ptas por cada empleado que se encuentre directamente a cargo del empleado en cuestión.
7 Es la comisión. Los valores nulos serán sustituidos por ceros.
8 Suma de todos los conceptos anteriores.
– El listado irá ordenado por Apellido.
CREATE OR REPLACE PROCEDURE liquidar
AS
CURSOR c_emp IS
SELECT apellido, emp_no, oficio, salario,
NVL(comision,0) comision, dept_no, fecha_alt
FROM emple
ORDER BY apellido;
vr_emp c_emp%ROWTYPE;
v_trien NUMBER(9) DEFAULT 0;
v_comp_r NUMBER(9);
v_total NUMBER(10);
BEGIN
FOR vr_emp in c_emp LOOP
/* Calcular trienios. Llama a la función trienios
creada en el ejercicio 11.8 */
v_trien := trienios(vr_emp.fecha_alt,SYSDATE)*5000;

/* Calcular complemento de responsabilidad.
Se
encierra en un bloque pues levantará NO_DATA_FOUND*/
BEGIN
SELECT COUNT(*) INTO v_comp_r
FROM EMPLE WHERE DIR = vr_emp.emp_no;
v_comp_r := v_comp_r *10000;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_comp_r:=0;
END;
/* Calcular el total del empleado */
v_total := vr_emp.salario + vr_emp. comision +
v_trien + v_comp_r;
/* Visualizar datos del empleado */
DBMS_OUTPUT.PUT_LINE('*************************************');
DBMS_OUTPUT.PUT_LINE(' Liquidacion de : '|| vr_emp.apellido
||' Dpto: ' || vr_emp.dept_no
|| ' Oficio: ' || vr_emp.oficio);
DBMS_OUTPUT.PUT_LINE(RPAD('Salario:',16)
||LPAD(TO_CHAR(vr_emp.salario,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE(RPAD('Trienios: ',16)
|| LPAD(TO_CHAR(v_trien,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE('Comp.
Respons: '
||LPAD(TO_CHAR(v_comp_r,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE(RPAD('Comision: ' ,16)
||LPAD(TO_CHAR(vr_emp.comision,'9,999,999'),12));
DBMS_OUTPUT.PUT_LINE('------------------');
DBMS_OUTPUT.PUT_LINE(RPAD(' Total : ',16)
||LPAD(TO_CHAR(v_total,'9,999,999') ,12));
DBMS_OUTPUT.PUT_LINE('**************************************');
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No se ha encontrado ninguna fila');
END liquidar;
/* Nota: También se puede utilizar una cláusula SELECT más compleja:
CURSOR c_emp IS
SELECT APELLIDO, EMP_NO, OFICIO,
(EMP_CARGO * 10000) COM_RESPONSABILIDAD,
SALARIO, NVL(COMISION, 0) COMISION, DEPT_NO,
TRIENIOS(FECHA_ALT, SYSDATE) * 5000 TOT_TRIENIOS
FROM EMPLE,(SELECT DIR,COUNT(*) EMP_CARGO FROM EMPLE
GROUP BY DIR) DIREC
WHERE EMPLE.EMP_NO = DIREC.DIR(+)
ORDER BY APELLIDO;
de esta forma se simplifica el programa y se evita la utilización de variables de trabajo. */

12) Crear la tabla T_liquidacion con las columnas apellido, departamento, oficio, salario, trienios, comp_responsabilidad, comisión y total; y modificar la aplicación anterior para que en lugar de realizar el listado directamente en pantalla, guarde los datos en la tabla. Se controlarán todas las posibles incidencias que puedan ocurrir durante el proceso.
CREATE TABLE t_liquidacion (
APELLIDO VARCHAR2(10),
DEPARTAMENTO NUMBER(2),
OFICIO VARCHAR2(10),
SALARIO NUMBER(10),
TRIENIOS NUMBER(10),
COMP_RESPONSABILIDAD NUMBER(10),
COMISION NUMBER(10),
TOTAL NUMBER(10)
);
CREATE OR REPLACE PROCEDURE liquidar2
AS
CURSOR c_emp IS
SELECT apellido, emp_no, oficio, salario,
NVL(comision,0) comision, dept_no, fecha_alt
FROM emple
ORDER BY apellido;
vr_emp c_emp%ROWTYPE;
v_trien NUMBER(9) DEFAULT 0;
v_comp_r NUMBER(9);
v_total NUMBER(10);
BEGIN
COMMIT WORK;
FOR vr_emp in c_emp LOOP
/* Calcular trienios. Llama a la función trienios
creada en el ejercicio 11.8 */
v_trien := trienios(vr_emp.fecha_alt,SYSDATE)*5000;

/* Calcular complemento de responsabilidad.
Se
encierra en un bloque pues levantará NO_DATA_FOUND*/
BEGIN
SELECT COUNT(*) INTO v_comp_r
FROM EMPLE WHERE DIR = vr_emp.emp_no;
v_comp_r := v_comp_r *10000;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_comp_r:=0;
END;
/* Calcular el total del empleado */
v_total := vr_emp.salario + vr_emp. comision +
v_trien + v_comp_r;
/* Insertar los datos en la tabla T_liquidacion */
INSERT INTO t_liquidacion
(APELLIDO, OFICIO, SALARIO, TRIENIOS,
COMP_RESPONSABILIDAD, COMISION, TOTAL)
VALUES
(vr_emp.apellido, vr_emp.oficio, vr_emp.salario,
v_trien, v_comp_r, vr_emp.comision, v_total);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK WORK;
END liquidar2;

SQL DECLARAR CURSOR

SQL DECLARAR CURSOR
CREATE TABLE PAISES
(CODPA NUMBER(3) NOT NULL PRIMARY KEY,
NOMPA VARCHAR2(20),
CONPA VARCHAR2 (10));

INSERT INTO PAISES VALUES(10,'COLOMBIA','AMERICA');
INSERT INTO PAISES VALUES(20,'BRASIL','AMERICA');
INSERT INTO PAISES VALUES(30,'PERU','AMERICA');
INSERT INTO PAISES VALUES(40,'ESPAÑA','AMERICA');
INSERT INTO PAISES VALUES(50,'FRANCIA','AMERICA');
INSERT INTO PAISES VALUES(60,'UGANDA','AMERICA');

SELECT * FROM PAISES;

set SERVEROUTPUT ON;

declare cursor cpaises
is
select codpa, nompa, conpa
from paises;
copa number(3);
nopa varchar2(20);
conpa varchar2(10);
begin
 open cpaises;
 loop
   fetch cpaises into copa,nopa,conpa;
   exit when cpaises%notfound;
   dbms_output.put_line(cpaises%rowcount ||'Pais'||nopa);
 end loop;
 close cpaises;
 end;


TABLAS DE MULTIPLICAR

TABLAS DE MULTIPLICAR
create table multiplicaciones
(
    n1 number (12),
    n2 number (12),
    resul number (12)
);
declare
n1 multiplicaciones.n1%TYPE;
n2 multiplicaciones.n2%TYPE;
resul multiplicaciones.resul%TYPE ;
begin
n1:=1;
n2:=1;
resul:=1*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=1;
n2:=2;
resul:=1*2;
insert into multiplicaciones values(n1,n2,resul);
n1:=1;
n2:=3;
resul:=1*3;
insert into multiplicaciones values(n1,n2,resul);
n1:=1;
n2:=4;
resul:=1*4;
insert into multiplicaciones values(n1,n2,resul);
n1:=1;
n2:=5;
resul:=1*5;
insert into multiplicaciones values(n1,n2,resul);
n1:=2;
n2:=1;
resul:=2*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=2;
n2:=3;
resul:=2*3;
insert into multiplicaciones values(n1,n2,resul);
n1:=2;
n2:=4;
resul:=2*4;
insert into multiplicaciones values(n1,n2,resul);
n1:=2;
n2:=5;
resul:=2*5;
insert into multiplicaciones values(n1,n2,resul);
n1:=3;
n2:=1;
resul:=3*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=3;
n2:=2;
resul:=3*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=3;
n2:=3;
resul:=3*3;
insert into multiplicaciones values(n1,n2,resul);
n1:=3;
n2:=4;
resul:=3*4;
insert into multiplicaciones values(n1,n2,resul);
n1:=3;
n2:=5;
resul:=3*5;
insert into multiplicaciones values(n1,n2,resul);
n1:=4;
n2:=1;
resul:=4*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=4;
n2:=2;
resul:=4*2;
insert into multiplicaciones values(n1,n2,resul);
n1:=4;
n2:=3;
resul:=4*3;
insert into multiplicaciones values(n1,n2,resul);
n1:=4;
n2:=4;
resul:=4*4;
insert into multiplicaciones values(n1,n2,resul);
n1:=4;
n2:=5;
resul:=4*5;
insert into multiplicaciones values(n1,n2,resul);
n1:=5;
n2:=1;
resul:=5*1;
insert into multiplicaciones values(n1,n2,resul);
n1:=5;
n2:=2;
resul:=5*2;
insert into multiplicaciones values(n1,n2,resul);
n1:=5;
n2:=3;
resul:=5*3;
insert into multiplicaciones values(n1,n2,resul);
n1:=5;
n2:=4;
resul:=4*5;
insert into multiplicaciones values(n1,n2,resul);
n1:=5;
n2:=5;
resul:=5*5;
insert into multiplicaciones values(n1,n2,resul);
end ;
select *from multiplicaciones;

TRIGGER

TRIGGER
CREATE OR REPLACE TRIGGER E_SALARIO
BEFORE INSERT ON EMPLEADOS FOR EACH ROW
BEGIN
IF (:NEW.FECHA = '31/07/2017')THEN
:NEW.SALARIO:= ((:NEW.SALARIO*0.1)+:NEW.SALARIO);
END IF;

END E_SALARIO;

FUNCIÓN SALARIO

FUNCIÓN SALARIO
create or replace function f_SUELDO (SALARIO number)
  RETURN VARCHAR2
 IS
  SUELDO VARCHAR2(10);
 BEGIN
   SUELDO:='';
   IF SALARIO<600000 then
    SUELDO:='BAJO';
    ELSIF SALARIO BETWEEN 600000 AND 900000
    THEN SUELDO:='POBRE';
   ELSE SUELDO:='REGULAR';
   END IF;
   RETURN SUELDO;
 END f_SUELDO;

SALARIO BAJO O ALTO SQL - FUNCION

SALARIO BAJO O ALTO SQL  - FUNCION
 CREAR TABLA TRABAJADORES (cambiar nombre)


create or replace function f_salario (avalor number)
  return varchar
 is
  TIPODESALARIO varchar(20);
 begin
    TIPODESALARIO:='';
   if avalor<=900000 then
    TIPODESALARIO:='bajo salario';
   else TIPODESALARIO:='alto salario';
   end if;
   return TIPODESALARIO;
 end;

  select NOMBRETRABAJADOR,f_salario(TIPODESALARIO) from TRABAJADORES;

TRIGGER - SQL

TRIGGER - SQL
create table estudiantes(codest number(3) not null primary key,nomest varchar2(20));

create table control(usuario varchar2(5),  fecha date);


create or replace trigger t_control
before insert on estudiantes
begin
  insert into control values(user,sysdate);
  end t_control;
 
 
  insert into estudiantes values
  (10,'picoro');
  insert into estudiantes values
  (20,'Bulma');
  insert into estudiantes values
  (30,'Mroshi');
 
  SELECT * FROM ESTUDIANTES;
  select*FROM CONTROL;

SQL CALCULAR PROMEDIOS

SQL CALCULAR PROMEDIOS
CREATE TABLE ESTUDIANTES
(
CODE NUMBER (3) NOT NULL ,
NOMBRE VARCHAR2 (20) ,
CARRERA VARCHAR2 (30)
) ;
ALTER TABLE ESTUDIANTES ADD CONSTRAINT ESTUDIANTES_PK PRIMARY KEY ( CODE ) ;


CREATE TABLE MATERIAS
( CODM NUMBER (3) NOT NULL , MATERIA VARCHAR2 (30)
) ;
ALTER TABLE MATERIAS ADD CONSTRAINT MATERIAS_PK PRIMARY KEY ( CODM ) ;

CREATE TABLE NOTAS
(
CODE NUMBER (3) NOT NULL ,
CODM NUMBER (3) NOT NULL ,
N1 FLOAT (2) ,
N2 FLOAT (2) ,
N3 FLOAT (2)
) ;
ALTER TABLE NOTAS ADD CONSTRAINT NOTAS_PK PRIMARY KEY ( CODE, CODM ) ;


ALTER TABLE NOTAS ADD CONSTRAINT FK_ASS_1 FOREIGN KEY ( CODE ) REFERENCES ESTUDIANTES ( CODE ) ;

ALTER TABLE NOTAS ADD CONSTRAINT FK_ASS_2 FOREIGN KEY ( CODM ) REFERENCES MATERIAS ( CODM ) ;


INSERTANDO DATOS A LA TABLA


INSERT INTO ESTUDIANTES VALUES
(1,'GOKU','ARTESMARCIALES');

INSERT INTO ESTUDIANTES VALUES
(2,'KRILIN','TAEKONDO');

INSERT INTO ESTUDIANTES VALUES
(3,'PICOLO','BOTANICA');

INSERT INTO MATERIAS VALUES
(10,'BIOLOGIA');

INSERT INTO MATERIAS VALUES
(20,'DEPORTES');

INSERT INTO MATERIAS VALUES
(30,'QUIMICA');

INSERT INTO NOTAS VALUES
(1,10,3.5,4.5,3.9);
INSERT INTO NOTAS VALUES
(1,30,4,3.5,3.8);
INSERT INTO NOTAS VALUES
(2,10,3.9,4.2,4.1);
INSERT INTO NOTAS VALUES
(2,20,4.3,4,4.3);
INSERT INTO NOTAS VALUES
(3,10,3.5,3.2,4.2);
INSERT INTO NOTAS VALUES
(3,30,3.3,4,3);


FUNCIONES Y RESULTADOS

CREATE OR REPLACE FUNCTION DEFINITIVA (n1 NUMBER,n2 NUMBER,n3 NUMBER)

return NUMBER

is

DEF float;

begin

DEF := (N1*0.3+N2*03+N3*0.4);

return DEF;

end DEFINITIVA;


SELECT E.CODE,E.NOMBRE,M.MATERIA ,N.N1 "PRIMERA NOTA",N.N2 "SEGUNDA NOTA",N.N3 "TERCERANOTA",DEFINITIVA (N1/3,N2/3,N3/3) "PROMEDIO ALUMNO"

FROM NOTAS N

INNER JOIN ESTUDIANTES E ON N.CODE = E.CODE

INNER JOIN MATERIAS M ON M.CODM = N.CODM


Cuadratica en SQL






create or replace procedure p_cuadratica(a number, b number, c number)
is
r1 number(7,2);
r2 number(7,2);
res number(7,2);
pot number(7,2);
rad number(7,2);
begin
   pot:=power(b,2);
   res:=4*a*c;
   rad:=pos-res;
   DBMS_OUTPUT.PUT_LINE('POTENCIA: '||POST);
   DBMS_OUTPUT.PUT_LINE('RADICAL: '||RAD);
   DBMS_OUTPUT.PUT_LINE('RESTA: '||REST);
 
   IF (rad > 0)then
      r1:=-(b-sqrt(pot-res))/2*a;
      r2:=-(b-sqrt(pot-res))/2*a;
      DBMS_OUTPUT.PUT_LINE('RAIZ 1: '||R1);
      DBMS_OUTPUT.PUT_LINE('RAIZ 2: '||R2);
   ELSE
   DBMS_OUTPUT.PUT_LINE('RAIZ NO VAILDA');
   END IF;
   END p_cuadratica;