210 likes | 351 Views
ORACLE ORDBMS. adminisztrációs feladatok 6. rész. 2004. dr. Kovács László. PL/SQL. 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(.. ). Blokk felépítés. DECLARE BEGIN EXCEPTION END. :=
E N D
ORACLE ORDBMS adminisztrációs feladatok 6. rész 2004 dr. Kovács László
PL/SQL 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(.. ) Blokk felépítés DECLARE BEGIN EXCEPTION END := IF .. THEN .. ELSE .. END IF WHILE .. LOOP .. END LOOP FOR I = .. LOOP … END LOOP EXIT WHEN WHEN .. THEN SQLCODE() SQLERRM()
PL/SQL variable r number; @P1 @p2 print r DECLARE I NUMBER; BEGIN FORJIN 1..5 LOOP :R := J; END LOOP; EXCEPTION WHEN OTHERS THEN :R := -1; END; . / DECLARE TYPETTISRECORD ( kod NUMBER, nev CHAR(20) ); ember TT; BEGIB ember.kod := 3; ember.nev := 'Peter'; END;
PL/SQL variable r number; execute :r := pp1(1); print r 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; . /
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 ABS POWER CEIL ROUND COS SIGN COSH SIN EXP SINH FLOOR SQRT LN TAN LOG TRUNC MOD karakter kezelő függvények ASCII CHR CONCAT INITCAP INSTR LENGTH LOWER LPAD LTRIM REPLACE RPAD RTRIM SUBSTR TRANSLATE UPPER konverziós függvények CONVERT TO_CHAR TO_DATE TO_NUMBER NVL DECODE dátum függvények SYSDATE ROUND ADD_MONTH
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 proba AS FUNCTION f1 (a IN CHAR) RETURN NUMBER; PROCEDURE p1 (a IN NUMBER, b OUT NUMBER) END proba; 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;
Fontosabb beépített csomagok - DBMS_ALERT események, riasztások kezelése - DBMS_DDL DDL funkciók meghívása - DBMS_DEBUG debug kezelő - DBMS_IOT láncolt rekordok lekérdezése - DBMS_JOB munkaköteg kezelő rutinok - DBMS_LOB LOB kezelő rutinok - DBMS_LOCK zárolás kezelés - DBMS_LOGMNR napló kelezés - DBMS_OLAP OLAP funkció kezelés - DBMS_OUTPUT üzenet bufferelés, kiírás - DBMS_PIPE pipe kezelő - DBMS_RANDOM véletlen szám generátor
Fontosabb beépített csomagok DBMS_RESOURCE_MANAGER erőforrás, QEP kezelő DBMS_ROWID ROWID kezelő - DBMS_SESSION bejelentkezések kezelése - DBMS_SNAPSHOT snapshot kezelő - DBMS_SPACE segment kezelő - DBMS_SQL dinamikus SQL - DBMS_TRACE PL/SQL trace kezelő - DBMS_UTILITY segéd rutinok - UTL_FILE állomány kezelő rutinok - UTL_HTTP http hívások kezelése - UTL_SMTP levél küldés kezelése - UTL_TCP alap TCP szolgáltatások köre
JOB kezelő csomag DBMS_JOB SUBMIT Procedure új munkaköteg létrehozása REMOVE Procedure munkaköteg megszüntetése CHANGE Procedure munkaköteg paraméterek változtatása NEXT_DATE Procedure következő futtatási időpont beállítása INTERVAL Procedure futtatások közötti időpont beállítása BROKEN Procedure munkaköteg letiltása RUN Procedure munkakö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
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 rekordegy 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;