2 stycznia 2011
ApEx – instalacja.
31 grudnia 2010
PL/SQL – przykład prostych procedur
create or replace procedure sfis_owner.wsp_kwadratow(numer varchar) AS CURSOR id_obszaru IS select obsz_id from sfis_owner.fis_obszary where obsz_kod like numer||'%' and obsz_rodzaj_obszaru='FAO'; BEGIN dbms_output.put_line('Podany numer ' || numer); FOR rekord IN id_obszaru LOOP -- trzeba ustawic 'set serveroutput on' na kliencie dbms_output.put_line(rekord.obsz_id); END LOOP; END /
DATA TYPE: composite (nested table of numbers): create or replace procedure sfis_owner.wsp_kwadratow(numer varchar) AS TYPE num_arr_type IS TABLE OF NUMBER; sid_obszarow num_arr_type; CURSOR id_obszaru IS select obsz_id from sfis_owner.fis_obszary where obsz_kod like numer||'%' and obsz_rodzaj_obszaru='FAO'; BEGIN sid_obszarow := num_arr_type(); dbms_output.put_line('Podany numer ' || numer); FOR rekord IN id_obszaru LOOP -- trzeba ustawic 'set serveroutput on' na kliencie -- dbms_output.put_line(rekord.obsz_id); sid_obszarow.extend; sid_obszarow(sid_obszarow.Count) := rekord.obsz_id; Dbms_Output.put_line(sid_obszarow.Count || ' ' || sid_obszarow(sid_obszarow.Count)); END LOOP; END;
Odwołania do wartości nested table of numbers: create or replace procedure sfis_owner.wsp_kwadratow(numer varchar) AS TYPE num_arr_type IS TABLE OF NUMBER; sid_obszarow num_arr_type; CURSOR id_obszaru IS select obsz_id from sfis_owner.fis_obszary where obsz_kod like numer||'%' and obsz_rodzaj_obszaru='FAO'; nr1 NUMBER; BEGIN sid_obszarow := num_arr_type(); dbms_output.put_line('Podany numer ' || numer); FOR rekord IN id_obszaru LOOP -- trzeba ustawic 'set serveroutput on' na kliencie -- dbms_output.put_line(rekord.obsz_id); sid_obszarow.extend; sid_obszarow(sid_obszarow.Count) := rekord.obsz_id; Dbms_Output.put_line(sid_obszarow.Count || ' ' || sid_obszarow(sid_obszarow.Count)); END LOOP; dbms_output.put_line('Koniec petli 1'); dbms_output.put_line(sid_obszarow(sid_obszarow.Count-2)); dbms_output.put_line(sid_obszarow.Count); nr1 := sid_obszarow.Count;dbms_output.put_line('nr1: ' || nr1); FOR X IN 1..nr1 LOOP dbms_output.put_line(X || ' ' || sid_obszarow(X)); END LOOP; END;
Kasowanie wartości nested table of numbers:
create or replace procedure sfis_owner.wsp_kwadratow(numer varchar) AS TYPE num_arr_type IS TABLE OF NUMBER; sid_obszarow num_arr_type; CURSOR id_obszaru IS select obsz_id from sfis_owner.fis_obszary where obsz_kod like numer||'%' and obsz_rodzaj_obszaru='FAO'; nr1 NUMBER; BEGIN sid_obszarow := num_arr_type(); dbms_output.put_line('Podany numer regionu: ' || numer); FOR rekord IN id_obszaru LOOP -- trzeba ustawic 'set serveroutput on' na kliencie -- dbms_output.put_line(rekord.obsz_id); sid_obszarow.extend; sid_obszarow(sid_obszarow.Count) := rekord.obsz_id; --Dbms_Output.put_line(sid_obszarow.Count || ' ' || sid_obszarow(sid_obszarow.Count)); END LOOP; --dbms_output.put_line('Koniec petli 1'); --dbms_output.put_line(sid_obszarow(sid_obszarow.Count-2)); --dbms_output.put_line(sid_obszarow.Count); nr1 := sid_obszarow.Count; --dbms_output.put_line('nr1: ' || nr1); FOR X IN 1..nr1 LOOP dbms_output.put_line(X || ' ' || sid_obszarow(X)); END LOOP; -- kasujemy rekord nr 5 sid_obszarow.DELETE(5); FOR X IN 1..nr1 LOOP -- trzeba sprawdzić czy rekord istnieje bo w przeciwnym wypadku wywali błąd IF(sid_obszarow.exists(X)) THEN dbms_output.put_line(X || ' ' || sid_obszarow(X)); END IF; END LOOP; END;
28 grudnia 2010
Oracle notes – PL/SQL basics
PL/SQL Procedural Language SQL
anonymous blocks – bez nazwy
procedures/functions – stored in data dictionary
packages – zgrupowane procedury i funkcje
Data Types
- scalar (binary_integer, integer, string …)
- composite (nested tables, varrays, record …)
r employees%rowtype;
nested tables of numbers:
TYPE – określamy jakiego jest typu
linia 5 – konstruktor – przypisujemy konstruktor do zmiennej (na razie on nie istnieje)
tworzymy go przez extend. W lini 7 tworzenie slotu dla zmiennych.
- reference – procedury mogą odwoływać się do refcursors.
Anonymous blocks:
od DECLARE do BEGIN – deklarujemy zmienne
od BEGIN do EXCEPTION – kod
“:=” (przypisanie wartości)
anchor data type – można przypisać typ danych do zmiennej na podstawie tabeli (linia 6)
Procedures:
tu są nasze procedury
select * from user_source;
select text from user_source where name = ‘nazwa_procedury’;
Zamiast DECLARE (jak w anoymouns blocks) jest AS. Pomiędzy AS a BEGING deklarujemy zmienne.
Wywołanie takiej procedury:
SQL> BEGIN
SQL> give_raises(1.5);
SQL> END;
SQL> /
lub:
exec give_raises(1.5);
CURSOR – to jest SELECT wewnątrz bloku PL/SQL który może zwrócić dużą liczbę rekordów.
Jeżeli SELECT może mieć więcej niż jeden wynik trzeba używać CUROSR’ów.
CURSOR – deklaracja kursora – i następnie SELECT
Cursor zostaje wykonane w kodzie (po BEGIN)
rec – nazwa zmiennej IN in nazwa kursora
count – metoda należąca do nested tables … count równe 1,2,3 …
Te wartości które mamy w tablicy możemy przkazać np do innej procedury.
Cursor teraz zawiera employee_id, hire_data
Aby zrobic updaty na cursorze trzeba go zrobic FOR UPDATE
WHER CURRENT OF EMP_CUR – praca na aktualnych danych w kursorze
LOOPS
EXCEPTION HANDLING
crate or replace procedure add_emp(eid number, last varchar2, first varchar2, email varchar2, hire_date date)
as
hire_date_excepition exception;
email_exception exception;
begin
if hire date > sysdate then
raise hird_date_exception;
end if;
if email is not null and email not like ‘%@%.%’ then
raise email_exception;
end if;
— jakis kod dodajacy pracownika
exception
when hire_date_exception then
dbms_output.put_line(‘wrong date’);
when email_exception then
dbms_output.put_line(‘wrong email format’);
end;
/
exception – tu się zaczyna blok exception
Wywołujemy procedurę:
exec add_emp(500,’Joe’,'Jule’,'joe@serwer.com’,sysdate + 2)
i zwraca błąd, że jest zła data.
Oracle notki, constraints, sequences, views
select * from USER_CONSTRAINTS;
select * from DBA_CONSTRAINTS;
aby sprawdzić na jakich kolumnach są nałożone constraints.
select constraint_name, column_name, position
from USER_CONS_COLUMNS
where constraint_name in(select constraint_name from user_constraints where table_name = ‘CITIES’);
create table as statement
create table COLORADO_PERSON as select * from PERSON where st = ‘CO’;
UNIC CONSTRAINT
FOREIGN CONSTRAINT – pozwala znaleźć releacje pomiędzy dwoma tablicami
tabela cities jest tu tabelą parent i tu są zdefiniowane miasta i stany. Przy próbie wpisu to tabeli person miasta i stanu którego nie ma w tabeli cities otrzymamy błąd.
Wyłączenie danego CONSTRAINT:
alter table PERSON disable constraint fk_person_cities;
alter table PERSON enable constraint fk_person_cities;
alter table users add constraint fk_users_person
foreign key(username) references person(username)
deferrable initially deferred;
SEQUENCE
VIEWS:
W drugim wypadku kolumny dokładnie odpowiadają nazwom kolumn w tabeli dlatego ten widok można wykorzystać do updateowania tabeli.
Oracle notki – installation.
Oracle – notki, SQL, PL/SQL
23 grudnia 2010
Oracle – sesje użytkowników.
Aby wyświetlić aktywne sesje użytkowników w bazie danych Oracle:
select b.Username, b.Osuser, b.Process, b.Machine, a.Spid, b.Program, b.Sid, b.Serial# from v$process a, v$session b where a.Addr = b.Paddr ORDER BY b.Machine /