1.1. fejezet, Oracle praktikák
Beküldte pzoli - 2011, május 16 - 1:29du
Tárolt eljárások készítése
Package fejléc módosítása után invalid a csomag. Újra kell fordítani a törzsét
ALTER package dbname.packagename compile body;
Csomag fejléc, törzs, minta kurzor használatra
CREATE OR REPLACE PACKAGE xSzamla AS PROCEDURE InsSzFej(aVNev varchar2,aSzFejID OUT NUMBER); PROCEDURE DelSzTet(aSzTetID NUMBER); FUNCTION getNextSzTkID RETURN NUMBER; PROCEDURE TMasol(ASzFejIDF NUMBER,ASzFejIDC NUMBER, CDone IN OUT NUMBER, PMESSAGE OUT VarChar2); END xSzamla;
Csomag deklaráció:
CREATE OR REPLACE PACKAGE BODY xSzamla AS PROCEDURE InsSzFej(aVNev varchar2,aSzFejID OUT NUMBER) IS BEGIN SELECT xsqHeadID.nextval INTO aSzFejID FROM dual; --Trigger elvégzi ezt, viszont nem adja vissza az értéket. Ora8-ason ez már megoldott INSERT INTO xSzFej (SzFejID,VNev) VALUES(aSzFejID,aVNev); END; PROCEDURE DelSzTetel(aSzTetelID NUMBER) IS BEGIN DELETE xSzTetel WHERE SzTetelID=aSzTetelID; END; FUNCTION getNextSzTkID RETURN NUMBER IS val NUMBER; BEGIN SELECT xsqSzTkID.nextval INTO val FROM dual; RETURN val; END; PROCEDURE TMasol(ASzFejIDF NUMBER,ASzFejIDC NUMBER, CDone IN OUT NUMBER, PMESSAGE OUT VarChar2) IS cursor c1 IS SELECT * FROM xSzTetel WHERE SzFejID = ASzFejIDF; wc1 c1%rowtype; BEGIN CDone := 0; OPEN c1; loop fetch c1 INTO wc1; exit WHEN c1%notfound; IF wc1.TOssz>0 THEN INSERT INTO xSzTetel VALUES (xsqRecordID.nextval,wc1.TJCim,wc1.TOssz,ASzFejIDC); CDone:=CDone+1; END IF; END loop; close c1; exception WHEN others THEN IF c1%isopen THEN close c1; END IF; pmessage:=sqlerrm; END; END xSzamla;
Mintapélda a kimenő kurzor paraméterre
CREATE OR REPLACE PACKAGE REF_CURSOR_TEST IS TYPE T_ACCOUNTS_CURSOR IS REF CURSOR; PROCEDURE GET_ACCOUNTS_PROCEDURE (P_ACCOUNTS OUT T_ACCOUNTS_CURSOR); END REF_CURSOR_TEST; / CREATE OR REPLACE PACKAGE BODY REF_CURSOR_TEST IS PROCEDURE GET_ACCOUNTS_PROCEDURE ( P_ACCOUNTS OUT T_ACCOUNTS_CURSOR ) AS BEGIN OPEN P_ACCOUNTS FOR SELECT Account_ID AS Id, Account_FirstName AS FirstName, Account_LastName AS LastName, Account_Email AS EmailAddress FROM Accounts ORDER BY Account_ID; END GET_ACCOUNTS_PROCEDURE; END REF_CURSOR_TEST;
praktikus megoldások sqlplus használatához
Dátum kezelés:
SELECT to_char ( trunc( to_date('2001.02.07. PM 6:25','YYYY.MM.DD PM HH:MI') ) ,'YYYY.MM.DD HH24:MI:SS' ) FROM dual;
Kiiratás standard outputra:
SET serveroutput ON; SET linesize 2000; DECLARE x varchar2(200); BEGIN x:='Put out a line...'; dbms_output.put_line(x); END; SHOW err;
Karakter kódolás lekérdezése:
DECLARE id NUMBER; BEGIN id:=NLS_CHARSET_ID('CHAR_CS'); dbms_output.put_line(NLS_CHARSET_NAME(id)); END;
Tárolt eljárás futtatása után csak a dbms_output eredmények jelenjenek meg
sqlplus -S >temp <<EOF dbname/passwd@servername SET feed off; SET serveroutput ON; DECLARE w NUMBER; BEGIN SELECT COUNT(*) INTO w FROM notes; dbms_output.put_line(w); END; / EOF
Fájlba írás
DECLARE ufile UTL_FILE.FILE_TYPE; wPath varchar2(256); wFName varchar2(256); BEGIN wPath:='/usr/var/files'; wFName:='temp'; ufile:=UTL_FILE.FOPEN('/usr/var/files','temp','a'); UTL_FILE.PUT (ufile, 'Helló'); UTL_FILE.NEW_LINE (ufile,1); UTL_FILE.FCLOSE (ufile); EXCEPTION WHEN UTL_FILE.INVALID_PATH THEN DBMS_OUTPUT.PUT_LINE('UTL_INVALID_PATH'); WHEN UTL_FILE.INVALID_MODE THEN DBMS_OUTPUT.PUT_LINE('UTL_INVALID_MODE'); WHEN UTL_FILE.INVALID_FILEHANDLE THEN DBMS_OUTPUT.PUT_LINE('UTL_INVALID_FILEHANDLE'); WHEN UTL_FILE.INVALID_OPERATION THEN DBMS_OUTPUT.PUT_LINE('UTL_INVALID_OPERATION'); WHEN UTL_FILE.READ_ERROR THEN DBMS_OUTPUT.PUT_LINE('UTL_READ_ERROR'); WHEN UTL_FILE.WRITE_ERROR THEN DBMS_OUTPUT.PUT_LINE('UTL_WRITE_ERROR'); WHEN UTL_FILE.INTERNAL_ERROR THEN DBMS_OUTPUT.PUT_LINE('UTL_INTERNAL_ERROR'); END;
Kurzor használata
SET serveroutput ON; DECLARE s1 CONSTANT NUMBER := 5000; cursor c1 IS SELECT * FROM notes; BEGIN FOR nrec IN c1 loop dbms_output.put_line(nrec.value); END loop; END; /
Általános feladatok
Megszorítások egy táblára
ALTER TABLE notes ADD CONSTRAINT value_len CHECK (LENGTH(VALUE)>1); ALTER TABLE notes MODIFY CONSTRAINT value_len disable; --enable ALTER TABLE notes DROP CONSTRAINT value_len;
Táblák és indexek létrehozása
CREATE TABLE xSzFej( SzFejID NUMBER(10) PRIMARY KEY, VNev varchar2(30) NOT NULL, VDatum DATE DEFAULT SYSDATE ); CREATE TABLE xSzTukor( SzTukorID NUMBER(10) PRIMARY KEY, SzTukorMegnev varchar2(20), SzAdoSz NUMBER(2) DEFAULT 0 ); CREATE TABLE xSzTetel( SzTetelID NUMBER(10) PRIMARY KEY, TJCim NUMBER(10) REFERENCES xSzTukor(SzTukorID) NOT NULL, TOssz NUMBER(8) DEFAULT 0, SzFejID NUMBER(10) CONSTRAINT fk_SzFejID REFERENCES xSzFej(SzFejID) ON DELETE CASCADE ); CREATE INDEX idx_jogc ON xSzTetel(SzFejID,TJCim); CREATE INDEX idx_SzTukor ON xSzTukor(SzTukorMegnev);
Sorszám osztó létrehozása
CREATE SEQUENCE xsqHeadID;
Trigger létrehozása:
CREATE OR REPLACE TRIGGER before_xSzFej_insert BEFORE INSERT ON xSzFej FOR EACH ROW WHEN (NEW.SzFejID IS NULL) DECLARE nxid NUMBER; BEGIN SELECT xsqHeadID.nextVal INTO nxid FROM dual; :NEW.SzFejID:=nxid; END;
Összetett típusok kezelése
felsorolás típusok kezelése:
DECLARE TYPE nested_type IS TABLE OF VARCHAR2(30); TYPE varray_type IS VARRAY(5) OF INTEGER; TYPE assoc_array_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER; TYPE assoc_array_str_type IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER; TYPE assoc_array_str_type2 IS TABLE OF VARCHAR2(32) INDEX BY VARCHAR2(64); v1 nested_type; v2 varray_type; v3 assoc_array_num_type; v4 assoc_array_str_type; v5 assoc_array_str_type2; BEGIN -- an arbitrary number of strings can be inserted v1 v1 := nested_type('Shipping','Sales','Finance','Payroll'); v2 := varray_type(1, 2, 3, 4, 5); -- Up to 5 integers v3(99) := 10; -- Just start assigning to elements v3(7) := 100; -- Subscripts can be any integer values v4(42) := 'Smith'; -- Just start assigning to elements v4(54) := 'Jones'; -- Subscripts can be any integer values v5('Canada') := 'North America'; -- Just start assigning to elements v5('Greece') := 'Europe'; -- Subscripts can be string values END; /
Rekord típus használata:
DECLARE TYPE DeptRecTyp IS RECORD ( deptid NUMBER(4) NOT NULL := 99, dname departments.department_name%TYPE, loc departments.location_id%TYPE, region regions%ROWTYPE ); dept_rec DeptRecTyp; BEGIN dept_rec.dname := 'PURCHASING'; END; /
Praktikus lekérdezések
SELECT * FROM all_views SELECT * FROM all_tab_columns SELECT * FROM all_db_links SELECT * FROM all_objects SELECT * FROM dba_tablespaces SELECT * FROM v$tablespace SELECT * FROM user_tablespaces SELECT * FROM all_constraints WHERE TABLE_NAME = 'MCOMMSISDN'
- A hozzászóláshoz be kell jelentkezni