ORACLE ORDBMS adminisztrációs feladatok 6. rész dr. Kovács László 2004
PL/SQL DECLARE BEGIN EXCEPTION END név típus := kezdőérték név CONSTANT típus := érték név t.m%TYPE név t%ROWTYPE TYPE tip IS TABLE OF tipus TYPE tip IS RECORD(.. ) WHEN.. THEN SQLCODE() SQLERRM() := IF.. THEN.. ELSE.. END IF WHILE.. LOOP.. END LOOP FOR I =.. LOOP … END LOOP EXIT WHEN Blokk felépítés
DECLARE I NUMBER; BEGIN FOR J IN 1..5 LOOP :R := J; END LOOP; EXCEPTION WHEN OTHERS THEN :R := -1; END;. / variable print r PL/SQL DECLARE TYPE TT IS RECORD ( kod NUMBER, nev CHAR(20) ); ember TT; BEGIB ember.kod := 3; ember.nev := 'Peter'; END;
CREATE FUNCTION PP1(P NUMBER) RETURN CHAR AS TYPE FT IS TABLE OF CHAR(10); FTABLA FT := FT(' ',' ',' ',' ',' ',' '); BEGIN FTABLA(3) := 'ALMA'; FTABLA(5) := 'SZILVA'; FTABLA(6) := 'EPER'; RETURN FTABLA(P); END;. / variable r number; execute :r := pp1(1); print r PL/SQL
Adatbázis adatok kezelése SELECT.. INTO valt FROM.. DECLARE CURSOR cnev(..) IS SELECT.. OPEN cnev(..) FETCH cnev INTO … CLOSE cnev FOR valt IN cnev LOOP … END LOOP UPDATE.. SET …WHERE … DELETE FROM … WHERE …
CREATE FUNCTION P (D NUMBER) RETURN NUMBER IS CURSOR E_cursor IS SELECT fizetes, jutalom FROM dolg WHERE kod = D; ossz_fiz NUMBER(11, 2) := 0; db NUMBER(10) := 1; BEGIN FOR dolgozo IN E_cursor LOOP dolgozo.jutalom := NVL(dolgozo.jutalom, 0); ossz_fiz := ossz_fiz + dolgozo.fizetes + dolgozo.jutalom; db := db + 1; END LOOP; RETURN ossz_fiz/db; EXCEPTION WHEN OTHERS THEN RETURN –1; END P;
PL/SQL Hibakezelés WHEN kod THEN WHEN OTHERS THEN DECLARE hh EXCEPTION RAISE hh WHEN hh THEN NO_DATA_FOUND VALUE_ERROR STORAGE_ERROR PROGRAM_ERROR ZERO_DIVIDE minta hibára
PL/SQL Beéptett függvények matematikai függvények ABSPOWER CEILROUND COSSIGN COSHSIN EXPSINH FLOORSQRT LNTAN LOGTRUNC MOD karakter kezelő függvények ASCIICHR CONCATINITCAP INSTRLENGTH LOWERLPAD LTRIMREPLACE RPADRTRIM SUBSTRTRANSLATE UPPER konverziós függvények CONVERT TO_CHAR TO_DATETO_NUMBER NVLDECODE dátum függvények SYSDATEROUND ADD_MONTH
minta
Csomag (package) Logikailag összetartozó tárolt eljárások, függvények és változók együttese Egységként töltődik be a memóriába Egyidejűleg többen is használhatják A csomagok LRU stratégiával tárolódnak Package szerkezete: - definiciós rész (interface megadása) - törzs rész (elemek részletes leírása) Private elemek: olyan eleme, mely csak a törzs részben szerepel, a definíciós részben nem Public elemek: szerepel a definíciós, interface részben Package létrehozása: 1. definíciós rész megadása 2. törzs megadása
Kezelő parancsok: CREATE PACKAGE csnev AS PL-SQL definíciók END csnev CREATE PACKAGE BODY csnev AS PL/SQL törzs END csnev DROP PACKAGE csnev hivatkozás csomag.tag csomag.tag(..)
CREATE PACKAGE BODY proba AS FUNCTION f1 (a IN CHAR) RETURN NUMBER AS BEGIN RETURN a + 1; END; PROCEDURE p1 (a IN NUMBER, b OUT NUMBER) BEGIN …. END; END proba; CREATE PACKAGE proba AS FUNCTION f1 (a IN CHAR) RETURN NUMBER; PROCEDURE p1 (a IN NUMBER, b OUT NUMBER) END proba;
Fontosabb beépített csomagok - DBMS_ALERTesemények, riasztások kezelése - DBMS_DDLDDL funkciók meghívása - DBMS_DEBUGdebug kezelő - DBMS_IOTláncolt rekordok lekérdezése - DBMS_JOBmunkaköteg kezelő rutinok - DBMS_LOBLOB kezelő rutinok - DBMS_LOCKzárolás kezelés - DBMS_LOGMNRnapló kelezés - DBMS_OLAPOLAP funkció kezelés - DBMS_OUTPUTüzenet bufferelés, kiírás - DBMS_PIPEpipe kezelő - DBMS_RANDOMvéletlen szám generátor
DBMS_RESOURCE_MANAGERerőforrás, QEP kezelő DBMS_ROWIDROWID kezelő - DBMS_SESSIONbejelentkezések kezelése - DBMS_SNAPSHOTsnapshot kezelő - DBMS_SPACEsegment kezelő - DBMS_SQLdinamikus SQL - DBMS_TRACEPL/SQL trace kezelő - DBMS_UTILITYsegéd rutinok - UTL_FILEállomány kezelő rutinok - UTL_HTTPhttp hívások kezelése - UTL_SMTPlevél küldés kezelése - UTL_TCPalap TCP szolgáltatások köre Fontosabb beépített csomagok
JOB kezelő csomag DBMS_JOB SUBMIT Procedureúj munkaköteg létrehozása REMOVE Proceduremunkaköteg megszüntetése CHANGE Proceduremunkaköteg paraméterek változtatása NEXT_DATE Procedurekövetkező futtatási időpont beállítása INTERVAL Procedurefuttatások közötti időpont beállítása BROKEN Proceduremunkaköteg letiltása RUN Proceduremunkaköteg futtatása BEGIN DBMS_JOB.SUBMIT(:jobno, ‘PP1(2);' SYSDATE, 'SYSDATE + 1'); commit; END;
Üzenet kiírás DBMS_OUTPUT(PLSQL: SET SERVEROUTPUT ON) ENABLE üzenet kiírás engedélyezés DISABLE üzenet kiírás letiltás PUT_LINE sor kiírása a bufferbe NEW_LINE sor lezására GET_LINE sorok kiolvasása a bufferből sql>SET SERVEROUTPUT ON sql>EXECUTE PP(‘OPEL’); CREATE PROCEDURE PP(X IN CHAR) AS V NUMBER; BEGIN SELECT MAX(AR) INTO V FROM AUTOK WERE TIPUS=X DBMS_OUTPUT.PUT_LINE(‘MAX = ' || TO_CHAR(V)); END;
Állománykezelés megadott könyvtárban kell elhelyezni az állományt init.ora : UTL_FILE_DIR UTL_FILE FOPEN file megnyitása IS_OPEN nyitott-e a file? FCLOSE file lezására FCLOSE_ALL minden file zására GET_LINE egy sor olvasása PUT egy sor kiírása NEW_LINE sorvégjel kiírása PUT_LINE sor kiírás sorvéggel FFLUSH buffer ürítése kiírással FOPENállomány nyitása
minta
Dinamikus SQL DBMS_SQL OPEN_CURSOR új kurzor nyitása SQL parancshoz PARSE az SQL parancs értelmezése BIND_VARIABLE változó kötése (input) DEFINE_ARRAY fogadó tömb definiálása (output) EXECUTE kurzor futtatása FETCH_ROWS sor beolvasása a kurzorból COLUMN_VALUE beolvasott rekord egy mező értékének lekérdezése CLOSE_CURSOR kurzor lezárás LAST_ROW_COUNT beolvasott sorok száma
CREATE OR REPLACE PROCEDURE demo(salary IN NUMBER) AS cursor_name INTEGER; rows_processed INTEGER; BEGIN cursor_name := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(cursor_name, 'DELETE FROM emp WHERE sal > :x', dbms_sql.native); DBMS_SQL.BIND_VARIABLE(cursor_name, ':x', salary); rows_processed := DBMS_SQL.EXECUTE(cursor_name); DBMS_SQL.CLOSE_CURSOR(cursor_name); EXCEPTION WHEN OTHERS THEN DBMS_SQL.CLOSE_CURSOR(cursor_name); END;
begin c := dbms_sql.open_cursor; dbms_sql.parse(c, 'select n from t order by 1', dbms_sql); dbms_sql.define_array(c, 1, n_tab, 10, indx); d := dbms_sql.execute(c); loop d := dbms_sql.fetch_rows(c); dbms_sql.column_value(c, 1, n_tab); exit when d != 10; end loop; dbms_sql.close_cursor(c); exception when others then if dbms_sql.is_open(c) then dbms_sql.close_cursor(c); end if; end;