Laboratorio di PL/SQL

Похожие документы
PL/SQL e PLpgSQL. Audiolezione 28b. Necessità. Soluzioni. Embedded SQL. Alfio Ferrara - Stefano Montanelli. Estensioni procedurali di SQL

Laboratorio di PL/SQL 3 Esercizi svolti e valutati

Soluzione degli esercizi PL-SQL

FUNZIONI. Dichiarazione: Definizione:

Basi di Dati: Corso di laboratorio

VARIABILI, ASSEGNAZIONE, DECISIONI

Operazioni scatenanti. Nozione ed uso. Sintassi. Esempio

Oracle PL/SQL. Motivazioni

Stored Procedure. Antonella Poggi. Dipartimento di informatica e Sistemistica Sapienza Università di Roma

Triggers Esercitazione 1

Triggers. Antonella Poggi, Claudio Corona. Dipartimento di informatica e Sistemistica Università di Roma La Sapienza

σ data 15/12/2013 data 20/12/2014

LA REALIZZAZIONE DI APPLICAZIONI ALCUNE ARCHITETTURE

LA REALIZZAZIONE DI APPLICAZIONI. Quattro parti: Gestione dati. Business rules. Logica applicativa. Interfaccia utente. Molte possibili architetture

Silvia Chiusano, Paolo Garza 1

Connessione con MySQL

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Connessione con MySQL

Soluzione esercitazione 01

Manuale PL/Sql - Emanuele Tertulliani

SQL - Structured Query Language

Fondamenti di Teoria delle Basi di Dati

La connessione ai database MySQL tramite script PHP versione 5.5

Suggerimenti per lo Sviluppo delle Applicazioni con PL/SQL. Simona Rotolo

SQL Esercitazione (database e tabelle) Ing. Cosimo Orlacchio

Stored Procedure. Prof. Alfredo Pulvirenti

PL/SQL PL/SQL. Ordine degli elementi dei triggers di Oracle. Differenze nei triggers. Versione dei trigger e PSM di Oracle

Manuale SQL. Manuale SQL - 1 -

PL/SQL. linguaggio SQL di proprietà di Oracle Lo standard SQL è esteso dai principali sistemi commerciali:

Per poter interagire con un database in rete mediante uno script php bisogna. innanzitutto cerare una connessione. Ciò si ottiene mediante la funzione

Argomenti Corso SAP Online ABAP Completo

Capitolo 5. Soluzione: Soluzione in C:

Costrutti condizionali e iterativi

PL/SQL Uso di un linguaggio procedurale per un database

Corso di Basi di Dati/Laboratorio di Basi di Dati

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Come trattare il risultato di un comando SQL (relazioni) che

Linee guida per la programmazione di transazioni in PL/SQL

Stored Procedures. Massimo Mecella Dipartimento di Ingegneria informatica automatica e gestionale Antonio Ruberti Sapienza Università di Roma

SQL: le funzioni di aggregazione

Fondamenti di Informatica e Programmazione

Oracle - PL/SQL. Oracle: Prodotti

QL (Query Language) Alice Pavarani

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

VBA Principali Comandi

Транскрипт:

Laboratorio di PL/SQL Prof. Alessandra Lumini Alma Mater Studiorum - Università di Bologna Per la sintassi PL/SQL: ORACLE 11g Rel. 2 PL/SQL Language Reference 1 Schema DB 2 1

Procedure: definizione e call Una stored procedure è un blocco di codice PL/SQL dotato di un nome che viene mantenuto all interno del database (procedure/funzioni) CREATE OR REPLACE PROCEDURE nome_procedura [(parametri)] IS Definizioni; Corpo procedura; CREATE FUNCTION nome_funzione [(parametri)] RETURN tipo_dato IS Una procedura può essere richiamata utilizzando il comando call CALL nome_procedura([parametri]); 3 La procedura «Hello world» Procedura per stampare a video la stringa «Hello world» CREATE OR REPLACE PROCEDURE HELLOWORLD AS v1 varchar2(12) :='Hello World!'; DBMS_OUTPUT.PUT_LINE (v1); END HELLOWORLD; 1. Scrivere una procedura che stampi in output la stringa LABORATORIO DI BASI DATI come concatenazione di 4 variabili 4 2

Query con una singola riga Procedura per stampare a video il numero di prodotti CREATE OR REPLACE PROCEDURE NUMPRODOTTI AS nprod NUMBER(5,0); SELECT count(*) into nprod FROM NW.PRODUCTS ; DBMS_OUTPUT.PUT_LINE ('Numero di Prodotti:' nprod); 2. Scrivere una procedura che stampi il numero di ordini e il ricavo totale 5 Uso di condizioni Procedura per stampare il numero di ordini N gestiti da un impiegato (in input). Se N>100 stampa «high», se minore di 50 stampa «low» altrimenti «medium» create or replace PROCEDURE ProdImp(idImp number) AS nord NUMBER(5,0); SELECT count(*) into nord FROM NW.ORDERS WHERE EmployeeID=idImp ; IF (nord) > 100 THEN DBMS_OUTPUT.PUT_LINE ('High:' nord); ELSIF (nord) < 50 THEN DBMS_OUTPUT.PUT_LINE ('Low:' nord); ELSE DBMS_OUTPUT.PUT_LINE ('Medium:' nord); END IF; 3. Scrivere una procedura che classifica un cliente in base al totale acquistato (best >100K /standard/worst <5K ) 6 3

Gestione delle eccezioni Stampa dei dati di un cliente dato il nome. Gestire l assenza del cliente o la presenza di più di un record CREATE OR REPLACE PrintCliente(Nome VARCHAR2) AS vcliente NW_CUSTOMERS%ROWTYPE; SELECT * into vcliente FROM NW_CUSTOMERS WHERE COMPANYNAME LIKE Nome; DBMS_OUTPUT.PUT_LINE ('Cliente: ' vcliente.companyname ' ID: ' vcliente.customerid ); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('Cliente non trovato'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('Nome cliente non univoco'); 4. Scrivere una procedura che calcoli il totale degli ordini effettuati in una certa data. Gestire l assenza di ordini. 7 Uso di cicli Stampa N date a partire da una data iniziale CREATE OR REPLACE PROCEDURE PrintDates(iDate DATE, nprint NUMBER) IS v_counter NUMBER(2) := 0; LOOP EXIT WHEN v_counter >= nprint; DBMS_OUTPUT.PUT_LINE(TO_CHAR(iDate+v_counter,'DD FMMonth YYYY')); v_counter := v_counter + 1; --oppure for v_counter in 1.. nprint LOOP DBMS_OUTPUT.PUT_LINE(TO_CHAR(initDate+v_counter,'DD FMMonth YYYY')) 5. Scrivere una procedura che stampa il totale di N ordini a partire da IDOrd (N e IDOrd in input). Gestire con una eccezione l assenza di uno o più ordini 8 4

I cursori ciclo FOR Definire un cursore per visualizzare le categorie CREATE PROCEDURE PrintCategories IS CURSOR ccat IS SELECT CATEGORYID, CATEGORYNAME, DESCRIPTION FROM NW_CATEGORIES; FOR vcat IN ccat LOOP -- implicit open/fetch DBMS_OUTPUT.PUT_LINE(vCat.CATEGORYNAME ': ' vcat.description); -- Chiusura implicita 6. Definire un cursore per stampare i corrieri e quanti ordini hanno gestito 9 I cursori FETCH esplicito Definire un cursore per visualizzare le categorie CREATE PROCEDURE PrintCategories IS CURSOR ccat IS SELECT CATEGORYID, CATEGORYNAME, DESCRIPTION FROM NW_CATEGORIES ; vcat ccat%rowtype; OPEN ccat; LOOP FETCH ccat INTO vcat; EXIT WHEN ccat%notfound; DBMS_OUTPUT.PUT_LINE(vCat.CATEGORYNAME ': ' vcat.description); CLOSE ccat; 7. Definire un cursore per stampare i 10 clienti più affezionati (per numero di ordini) 10 5

I cursori parametrici Stampa di tutti i prodotti di una categoria (in input) CREATE PROCEDURE PrintProd (vidcat number) IS CURSOR cprod (pcat IN NW_CATEGORIES.CATEGORYID%TYPE) IS SELECT * FROM NW_PRODUCTS WHERE CATEGORYID=pCat; FOR vprod IN cprod LOOP DBMS_OUTPUT.PUT_LINE(vProd.PRODUCTID ': ' vprod.productname); 8. Data una città in input, stampare tutti i clienti residenti e per ciascuno la lista dei prodotti ordinati. 11 I cursori for UPDATE Aumenta del 10% il prezzo dei prodotti create table NW1_Products as select * from NW.Products; CREATE PROCEDURE IncPrice IS CURSOR cprod IS SELECT * FROM NW1_PRODUCTS FOR UPDATE OF UNITPRICE; FOR vprod IN cprod LOOP UPDATE NW1_PRODUCTS SET UNITPRICE=1.1*UNITPRICE WHERE CURRENT OF cprod; CREATE PROCEDURE IncPrice1 IS UPDATE NW1_PRODUCTS SET UNITPRICE=1.1*UNITPRICE; 9. Aumenta del P% il prezzo dei prodotti di un fornitore F, se il prodotto è già in riordino l aumento sarà del P/2% 12 6

Esercizi 10. Scrivere una procedura che visualizza il nome del cliente associato a un ordine. Gestire il caso di ordine non presente. 11. Scrivere una procedura che stampa i fornitori e l elenco dei prodotti forniti 12. Scrivere una procedura che restituisca separatamente il conteggio dei prodotti in tre fasce di prezzo date in input. 13. Scrivere una funzione che verifichi che un certo prodotto P sia presente in quantità > Q 14. Definire una tabella di appoggio: REORDER(idSupplier, idproduct, quantity, date) Scrivere una procedura che inserisce in REORDER un record per ciascun prodotto per cui la quantità è inferiore al livello di riordino 13 7