Programowanie « Różności …

Różności …

2 stycznia 2011

ApEx – instalacja.

Zaszufladkowany do: ApEx,Oracle — Tagi: , — Jacek @ 10:29

Fajny artykuł dotyczący instalacji ApExa.

31 grudnia 2010

PL/SQL – przykład prostych procedur

Zaszufladkowany do: Skrypty SQL i PL/SQL — Jacek @ 09:47
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

Zaszufladkowany do: Bazy danych,Oracle,PL/SQL,SQL — Tagi: — Jacek @ 12:16

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

Zaszufladkowany do: Bazy danych,Oracle,PL/SQL,SQL — Tagi: — Jacek @ 11:56
alter table person add constraint pk_person primary key(id);
compound primary key – złożony – na więcej niż jednej kolumnie.
create table citeis(city varchar(30), state char2(2), constraint pk_cities primary key(city,state));
obydwie kolumny będą widziane jako NOT NULL – ale to wcale nie znaczy że są primary_keys

select * from USER_CONSTRAINTS;
select * from DBA_CONSTRAINTS;

aby dowiedzieć się jakie są naprawdę constraints nałożone na daną tebelę.
select * from USER_CONS_COLUMNS;
select * from DBA_CONS_COLUMNS;

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’);

sprawdzenie domyśnej tablespace:
slect default_tablespace from user_users;
slect default_tablespace from dba_users;

create table as statement
create table COLORADO_PERSON as select * from PERSON where st = ‘CO’;

select * from USER_TAB_COLUMNS; – aby dowiedzieć się jak są zdefiniowane kolumny w danej tabeli;

UNIC CONSTRAINT

taki sam jak primary key ale dozwolone są NULL
alter table PERSON add constraint UK_PERSON_USERNAME unique(USERNAME);
alter table PERSON add constraint ck_person_gender check(gender in(‘M’,'F’));

FOREIGN CONSTRAINT – pozwala znaleźć releacje pomiędzy dwoma tablicami

jedna tablica to child druga to parent
dodajemy foreign constraint to child table:
alter table person add constraint fk_person_cities foreign key(city,state) references cities(city, state);

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.

select a.constraint_name, constraint_type, column_name, r_constraint_name
from user_constraints a, user_cons_clumns b
where a.constraint_name = b.constraint_name
and a.table_name = ‘PERSON’;

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

autoincrement, przechowuje liczby
create sequence username_seq start with 10 increment by 1;
select * from user sequences;
update users set id = username_seq.nextval;
select username_seq.currval from dual;

VIEWS:

create or replace view person_view(name) as
select last || ‘,’ || first
from person
order by last, first;
create or replace view person_view as
select last,first,city,st
from person
order by last,first;

W drugim wypadku kolumny dokładnie odpowiadają nazwom kolumn w tabeli dlatego ten widok można wykorzystać do updateowania tabeli.

select * from USER_VIEWS;
select * from DBA_VIEWS;
select * from DBA_OBJECTS;

Oracle notki – installation.

Zaszufladkowany do: Bazy danych,Oracle,PL/SQL,SQL — Tagi: — Jacek @ 11:29
database configuration assistant:
c:> dbca (w windowsach)
aby zapisać konfigurację bazy danych w windowsach i ewentualnie puszczać tworzenie instancji automatycznie:
c:\database> setup -record -destinationFile c:\database\basic.rsp (jest to tzw. response file)
uruchomi się instaler, ale na samym końcu nie nalży instalować tylko dać cancel
potem:
c:\database> setup -silent -responseFile c:\\database\basic.rsp
tworzenie bazy danych od podstaw:
najpierw należy stworzyć serwis:
oradim -new -sid test
potem należy utworzyć plik inittest.ora
#inittest.ora
DB_NAME=test
INSTANCE_NAME=test.johnson
CONTROL_FILES = (“c:\oracle\ctrlfiles\control01.ctl”, “c:\oracle\ctrlfiles\control02.ctl”, “c:\oracle\ctrlfiles\control03.ctl”)
BACKGROUND_DUMP_DEST = c:\oracle\product\10.2.0\admin\bdump
USER_DUMP_DEST = c:\oracle\product\10.2.0\admin\udump
DB_FILES = 1000
UNDO_MANAGEMENT = auto
UNDO_TABLESPACE=undo
SHARED_POOL_SIZE=75m  (jest używane do przechowywanie poleceń sql)
potem uruchamiamy
sqlplus / as sysdba
sql> startup nomount pfile=’c:\oracle\product\10.2.0\db_1\database\inittest.ora’
pfile to parameter file
potem należy stworzyć plik do utworzenia samej bazy danych: create.sql
– create.sql
CREATE DATABASE test
MAXLOGFILES 32
MAXDATAFILES 500
DATAFILE ‘c:\baza\system01.dbf’ SIZE 325M REUSE          (reuse – znaczy, że jeżeli plik już jest to zostanie nadpisany)
SYSAUX DATAFILE ‘c:\baza\sysaux01.dbf’ SIZE 300M REUSE
AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
UNDO TABLESPACE “UNDO” DATAFILE ‘c:\baza\undo01.dbf’
SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET WE8MSWIN1252
logfile ‘c:\baza\redo01.log’ size 100m reuse,
‘c:\baza\redo02.log’ size 100m reuse,
‘c:\baza\redo03.log’ size 100m reuse;
potem:
sql> @create.sql

Oracle – notki, SQL, PL/SQL

Zaszufladkowany do: Bazy danych,Oracle,PL/SQL,Programowanie,SQL — Tagi: , , — Jacek @ 11:16
sql> host – aby dostać się do promptu hosta
c:> echo %oracle_sid% lub echo $oracle_sid$
c:> exit
sql>
po zalaogowaniu można wydać komendę:
sql> define
i wyświetlą się parametry informujące o tym jako kto jesteśmy podłączeni
będąc podłączonym można podłączyć się jako inny user
sql> connect sys as sysdba
Sprawdzenie jakie tabele są w schemacie użytkownika:
sql> select table_name from user_tables;
sql> desc ps$ (opis tabeli)
sql> set pagesize 200
sql> / (ponowne uruchomienie polecenia z buforu)
sql> l lub list – wyswietla to co jest w buforze
w buforze jest tylko ostatnie polecenie
jeżeli chcemy coś zmienić w buforze:
sql> 2
podajemy numer linii w której chcemy zrobić zmianę
sql> c/name/surename
i określamy (c – change) co na co chcemy zamienić
SQL – Structured Query Language
określenie w jakim formacie ma zostać wyświetlana data;
sql> alter session set nls_date_format=’mm/dd/yyyy’;
można określić jak inne dane mają być wyświetlane:
sql> col sal fromat $999,999.00
sql> col ename heading ‘Employee|Name’
Jeżeli chcemy coś dodać do bufora:
sql> 1
sql> a ,nazwisko
aby format danej kolumny był taki jak jakiejś innej można:
sql> col comm like sal heading “Commision”
aby kolumna była szersza:
sql> col job format a15
wyszyszczenie formatowania:
sql> col comm clear
lub
sql> clear columns
jeżeli chcemy zachować ostatnią komendę z bufora:
sql> save plik.sql
uruchomienie
sql> @plik.sql
zapis wyników:
sql> spool plik.txt
sql> spool off
sql> host
c:> type plik.txt
c:> exit
sql> spool plik.txt append
można robić zmiany bufora w edytorze:
ed
i wyświetlić/zdefiniować edytor
define _editor
define _editor=c:\notepad
Jeżeli chcemy wstawić zmienną do zapytania
… where job=’&p’
sql> undefine p
aby wyświetlać po stronie:
sql> set pause on
sql> set pagesize 35
Plik z ustawieniami środowiska startowy:
SQLPATH=c:\oracle\product
tam trzeba umieścić plik:
login.sql
sql> help index
sql> help define
zmiana hasła
sql> passw user1
Na serwerze aplikacji można uruchomić isqlplus, który pozwala na dostęp do bazy danych przez przeglądarkę internetową:
c:> isqlplusctl start
potem w przeglądarce
http://localhost:5560/isqlplus

23 grudnia 2010

Oracle – sesje użytkowników.

Zaszufladkowany do: Bazy danych,Oracle,Skrypty SQL i PL/SQL — Tagi: — Jacek @ 16:44
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
/
« Nowsze wpisy

Strona startowa: www.jaceksen.pl