-- Esimerkki PL/SQL-lohkosta (Oraclen sample1.sql) -- temp-tauluun kirjoitetaan, onko muuttuja i parillinen vai pariton /* Jos haluat testata käskyä, luo temp-taulu ennen proseduurin suoritusta CREATE TABLE temp ( Nro SMALLINT, Sadat INT, Kuvaus VARCHAR2(50)); */ DECLARE x NUMBER := 100; BEGIN FOR i IN 1..10 LOOP IF MOD(i,2) = 0 THEN INSERT INTO temp VALUES (i, x, 'i on pariton'); ELSE INSERT INTO temp VALUES (i, x, 'i on parillinen'); END IF; x := x + 100; END LOOP; COMMIT; END; / ================================== -- esimerkki Oraclen poikkeuksista DECLARE EmpRec emp%rowtype; BEGIN select * into EmpRec from emp where deptno = 20; DBMS_OUTPUT.put_line(EmpRec.empno || ' ' || EmpRec.ename); EXCEPTION when no_data_found then DBMS_OUTPUT.put_line('Tietoja ei ole'); when too_many_rows then DBMS_OUTPUT.put_line('Rivejä > 1'); when others then DBMS_OUTPUT.put_line('Outo homma'); END; -- Esimerkki omasta poikkeuksesta DECLARE weekend_error EXCEPTION; not_finance_user EXCEPTION; BEGIN IF TO_CHAR(Sysdate,'DY') ='SAT' OR TO_CHAR(Sysdate,'DY') ='SUN' THEN RAISE weekend_error; END IF; IF SUBSTR(User,1,3) <> 'FIN' THEN RAISE not_finance_user; END IF; EXCEPTION WHEN weekend_error THEN RAISE_APPLICATION_ERROR(-20001, 'Poistoja ei sallita viikonloppuisin'); WHEN not_finance_user THEN RAISE_APPLICATION_ERROR(-20002, 'Vain finanssi-ihmiset voivat tehdä poistoja'); END; ======================================= Esimerkki eksplisiittisestä kursorista: -- Tulostaa näytölle kaikki työntekijät (EMP-taulusta) -- %ROWCOUNT: haettujen tietueiden lkm DECLARE cursor employee_cursor is select * from emp; EmpRec employee_cursor%ROWTYPE; -- tai emp%ROWTYPE BEGIN open employee_cursor; loop fetch employee_cursor into EmpRec; EXIT WHEN employee_cursor%NOTFOUND; DBMS_OUTPUT.put_line(EmpRec.empno || ' ' || EmpRec.ename); end loop; DBMS_OUTPUT.put_line('Työntekijöitä: ' || employee_cursor%ROWCOUNT); close employee_cursor; END; / ====================================== Esimerkki implisiittisestä kursorista: -- Tulostaa näytölle kaikki työntekijät (EMP-taulusta) DECLARE cursor employee_cursor is select * from emp; BEGIN for EmpRec in employee_cursor loop DBMS_OUTPUT.put_line(EmpRec.empno || ' ' || EmpRec.ename); end loop; END; / ============================================================= -- Aihe: Tallennetun proseduurin (stored procedure) tekeminen -- tee tallennettu proseduuri, joka tulostaa parametrina annetun -- osastonumeron kaikki tyontekijat (nro ja nimi) -- jos osastossa ei ole yhtään työntekijää, niin seuraa virheilmoitus -- Oracle 9i-versio: CREATE OR REPLACE PROCEDURE PrintEmp (nDeptno emp.deptno%TYPE) IS cursor employee_cursor is select * from emp where deptno = nDeptno; BEGIN for EmpRec in employee_cursor loop DBMS_OUTPUT.put_line(EmpRec.empno || ' ' || EmpRec.ename); end loop; EXCEPTION when no_data_found then DBMS_OUTPUT.put_line('Tietoja ei ole'); when others then DBMS_OUTPUT.put_line('Outo homma'); END PrintEmp; / -- kutsu esim. EXEC PrintEmp(20)