sábado, 30 de noviembre de 2013

basicos loops

/************* 019 LOOP2 ***********/

SET SERVEROUTPUT ON

BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE('I WANTED YOU');
  END LOOP;
END;

DECLARE
  l_count PLS_INTEGER := 0;

BEGIN 
  LOOP
    DBMS_OUTPUT.PUT_LINE('MUCH BETTER');
    l_count := l_count + 1;
    EXIT WHEN l_count = 20;
  END LOOP;

END;


/************* 020 LOOP2 ***********/

SET SERVEROUTPUT ON

BEGIN
  FOR v_count IN 1 .. 20 LOOP
    DBMS_OUTPUT.PUT_LINE('Iteration: ' || v_count);
  END LOOP;

END;


/************* 021 LOOP2 ***********/

SET SERVEROUTPUT ON

DECLARE
  l_count PLS_INTEGER := 1;

BEGIN
  WHILE l_count <= 20 LOOP
    DBMS_OUTPUT.PUT_LINE('While loop iteration: ' || l_count);
    l_count := l_count + 1;
  END LOOP;
END;

proc impares

HACER UN PROCEDIMIENTO QUE MUESTRE LOS NUMEROS IMPARES ENTRE 2 NUMEROS

/*CREAR LA FUNCION*/
CREATE OR REPLACE PROCEDURE
impares(n1 IN PLS_INTEGER, n2 IN PLS_INTEGER) IS
BEGIN

  FOR I IN n1 .. n2 LOOP
    if I mod 2 = 1 THEN
      DBMS_OUTPUT.PUT_LINE(I);
    END IF;
  
  END LOOP;

END;


/*llamar a la funcion*/

SET SERVEROUT PUT

BEGIN
impares(20,40);
END;

fun cursor letra libros

Crea una funcion que introduciendo una letra, diga el nº de libros que empiezan por ella.


CREATE OR REPLACE FUNCTION contador_de_libros(letra IN CHAR) PLS_INTEGER IS

 lr_books BOOK%ROWTYPE;
  cont PLS_INTEGER:=0;
  
CURSOR books_cursor(l char) IS SELECT * FROM book b
  WHERE UPPER(b.title) LIKE UPPER(letra) || '%';
  
  BEGIN
    OPEN books_cursor;
    
    LOOP
      FETCH books_cursor INTO lr_books;
      EXIT WHEN books_cursor%NOTFOUND;
      cont:=cont + 1;

    END LOOP;

    CLOSE books_cursor;
    RETURN cont;
  END;
  

proc monedas

Crear un procedimiento que introduzcas una cantidad y te diga cuantas monedas de cada son.

create or replace 
procedure cambio_monedas (importe IN PLS_INTEGER) IS

resto PLS_INTEGER := 0;
quinientos PLS_INTEGER := 0;
doscientos PLS_INTEGER := 0;
cien PLS_INTEGER := 0;
cincuenta PLS_INTEGER := 0;
veinte PLS_INTEGER := 0;
diez PLS_INTEGER := 0;
cinco PLS_INTEGER := 0;
dos PLS_INTEGER := 0;
uno PLS_INTEGER := 0;

BEGIN

quinientos := floor(importe / 500);
resto := importe MOD 500;

doscientos := floor(resto / 200);
resto := resto MOD 200;

cien := floor(resto / 200);
resto := resto MOD 200;

cincuenta := floor(resto / 50);
resto := resto MOD 50;

veinte := floor(resto / 20);
resto := resto MOD 20;

diez := floor(resto / 10);
resto := resto MOD 10;

cinco := floor(resto / 5);
resto := resto MOD 5;

dos := floor(resto / 2);
resto := resto MOD 2;

uno := floor(resto / 1);
resto := resto MOD 1;

DBMS_OUTPUT.PUT_LINE ('BILLETES DE 500: ' || quinientos);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 200: ' || doscientos);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 100: ' || cien);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 50: ' || cincuenta);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 20: ' || veinte);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 10: ' || diez);
DBMS_OUTPUT.PUT_LINE ('BILLETES DE 5: ' || cinco); 
DBMS_OUTPUT.PUT_LINE ('MONEDAS DE 2: ' || dos);
DBMS_OUTPUT.PUT_LINE ('MONEDAS DE 1: ' || uno);
END;

proc SQL borrado doble

Enunciado: Crea un procedimiento que haga una consulta a autores, 
introduce un ID de un autor y borra todo lo que haya hecho ese autor (libro y autor.)

create or replace 
PROCEDURE DEL_AUTHORS(id_author IN AUTHORS.ID%TYPE) IS
  CURSOR c_inventory(p_isbn BOOKS.ISBN%TYPE) IS 
    SELECT
    FROM INVENTORY 
    WHERE isbn = p_isbn; 
  
  CURSOR c_books(p_author_id AUTHORS.ID%TYPE) IS
    SELECT
    FROM BOOKS 
    WHERE AUTHOR1 = p_author_id OR AUTHOR2 = p_author_id OR AUTHOR3 = p_author_id;
  
BEGIN
  
  FOR I IN c_books(id_author) LOOP
    DBMS_OUTPUT.PUT_LINE(I.ISBN);
    
    FOR J IN c_inventory(I.ISBN) LOOP
      DELETE FROM INVENTORY WHERE isbn = J.ISBN;
    END LOOP;
    
    DELETE FROM BOOKS WHERE ISBN = I.ISBN;
  END LOOP;
  
  DELETE FROM AUTHORS WHERE ID =id_author;
END;

muy basico

BÁSICO SUMAS

DECLARE
      valor1 PLS_INTEGER:=1;
      valor2 PLS_INTEGER:=2;
      resultado PLS_INTEGER:=0;
BEGIN
      resultado:= valor1 + valor2;
      DBMS_OUTPUT.PUT_LINE(resultado);
END;


INTRODUCCIÓN A VARIABLES
SET serveroutput ON
DECLARE
mivarcar VARCHAR2(20);
mivarnum number(10,2):=50;
mivarfecha date;
BEGIN
  mivarcar:='Alberto';
  DBMS_OUTPUT.PUT_LINE('Hola'||mivarcar);
  DBMS_OUTPUT.PUT_LINE('Hola'||mivarnum);
  
  mivarfecha:=sysdate + 7;
  DBMS_OUTPUT.PUT_LINE('Hoy es '||to_char(sysdate,'dd/mm/yyyy')||', dentro de una semana sera '||
    to_char(mivarfecha,'dd/mm,yyyy'));

END;



SINTAXIS
La estructura del IF seria la siguiente:
IF <condición> THEN
   instrucciones
ELSEIF <condición> THEN
   instrucciones
....
ELSE
   instrucciones
END IF;
La estructura del WHILE seria la siguiente:
WHILE <condición> LOOP
   instrucciones
END LOOP;
La estructura del FOR se escribiría así:
FOR <variable> IN <mínimo> <máximo> LOOP
   instrucciones
END LOOP
Si queremos que nos vaya contando al revés, es decir de 5 hasta 0 por ejemplo, la sintaxis seria la siguiente:
FOR <variable> IN REVERSE
   <final>.......<inicio> LOOP
      instrucciones
      .....
END LOOP;
Y la estructura del LOOP seria de esta forma:
LOOP
   instrucciones
   ....
   EXIT WHEN <condición>
      instrucciones
   ...
END LOOP;