Oracle XML DB
v listerneru (listener.ora) nastavit naslouchani na dany port, a pak pres sethttpport nastavit spravne pozadavky
E.s. BEGIN DECLARE SECTION char uname[20][25]; /*20x string*/ short ind_uname[20]; E.S. END DECLARE SECTION E.S. INSERT INTO T(U) VALUES (:uname:ind_uname) <=> FOR (i=0;i<20;i++) { INSERT INTO T(U) VALUES(:uname[i]:ind_name[i]); }
E.S. OPEN C; zprac=0; for(;;) { E.S. FETCH C INTO :pole1, :pole2:ind_pole2,...; nyni = sqlca.sqlerrd[2] - zprac; //pocet zpracovanych radku poslednim fetchem / 0-velikost poli zprac += nyni; for (k=0;k<nyni;k++) { /* zpracuj k-ty prvek z pole */ } if (nyni < VELIKOST_POLI) break; }
najit na tirpitzu slozku proc a soubor zprac_pole.c v ni (ukazkove kody)
!! nakopirovat z /tmp
semora1 semora2 ---- ----- | | ---------> | | | | | | | | <--------- | | ---- -----
oboustranné linky
replikační master group
TODO: založit účty na semora2 (dbadmin/dbadmin)
přidělení práv
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
vlastní schéma:
create table moje_repl_tab(...);
repadmin:
DBMS_REPCAT.CREATE_MASTER_REPGROUP(gname => 'machvrep'); -- potom yaregistrovat objekty k replikaci DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'machvrep', type => 'TABLE', oname => 'REPLIKOVANA', sname => 'mach', ... );
min_communication .. minimaliyace komunikace, replikace jen změn
ukázkové použití - replikace.sql
asznchronni je cca jednou za 10 minut
– temelin –
– zaspal –
jak ošetřit chyby..
ukázkový kód s připojením a ošetřením chyb
E. S. WHENEVER [SQLERROR|SQLWARNING|NOT FOUND] alce;
select s více řádky nadefinovat kurzor, kterým budu procházet
E.S. DECLARE c CURSOR FOR SELECT ...;
(c není proměnná v c, jde o symbolické jméno pro preprocesor.)
E.S. OPEN c;
provede SELECT v DB
nekonečný cyklus procházející řádky
E.S. WHENEVER NOT FOUND DO break; //skonci to ten cyklus for(;;) { E.S. FETCH INTO :prom1, :prom2, :prom3,...; ... zpracuj radky ... }; E.S. WHENEVER NOT FOUND CONTINUE; //vypneme ten break E.S. CLOSE c;
hodnoty indikatoru EXEC SQL FETCH C INTO :tn:itn, :co:ico; if ico …
0 | OK |
-1 | NULL |
>0 | hodnota delsi nez promenna |
http://www.ms.mff.cuni.cz/~kopecky/oracleParallel.pdf
pro p5ehled jak dotaz vypada
set autotrace on|off|traceonly
výhody preprocesou
EXEC SQL příkaz; deklarace proměnných, které budou vidět i pro preprocesor, resp. databázi.
EXEC SQL BEGIN DECLARE SECTION . . . EXEC SQL END DECLARE SECTION
k dispozici máme atomické proměnné
navíc atomický pro oracle, sturktura pro C:
varchar prom[n];
v céčku se z toho stane struktura, která má délku a obsah
struct { short len; char arr[]; }
k=8; j=10; EXEC SQL insert into tabulka (K,J) values (:k,:j);
kde :x je odkaz na hostitelskou proměnnou jazyka
pro čtení z db:
EXEC SQL K,J INTO :k,:j FROM tabulka WHERE ...;
databáze musí vrátit právě jeden řádek (třeba ošetřit takové chyby)
char s1[10]; car*s2; varchar s3[10]; .. struct viz výše strcpy(s1,"ahoj"); s2="ahoj";
nebo
s2=malloc(100); strcpy(s2,"ahoj");
pokud bych udělal jen tohle
strcpy(s3.arr,"ahoj");
tak to nestačí, ještě třeba nastavit tu délku
s3.len=4;
resp.
s3.len=strlen(s3.arr); EXEC SQL insert into tabulka (txt) values (<:s1, :s2 nebo :s3>);
načtení dat
s2=malloc(10); EXEC SQL select txt into <:s1, :s2 nebo :s3> from tabulka ...; - s1: v pořádku, Oracle nakopíruje data a ukončí pomocí \0 - s2: třeba přepsat 9 znaků jinéým než \0, aby strlen správně vrátil velikost - s3: s3.arr[s3.len]='\0';
EXEC SQL CONNECT :x <-- 'jmeno/heslo@db'
nebo
EXEC SQL CONNECT :x identified by :y [using :z] <-- x .. jmeno nebo jmeno@db
E.S. CREATE TABLE Tabulka (txt varchar2(10));
nakonec
E. S. COMMIT|ROLLBACK WORK [RELEASE];
– release zaroven ukonci pripojeni k sql
soubory by měly mít příponu .ps a zkompilovat se dají skriptem pcc
Průběh startu databáze: startup → přečíst ini soubor (obsahující parametry konfigurace) → alokace SGA → start procesů → mount → čtou se řídící soubory → kontrola datových souborů → otevření datových souborů → nastartováno
při vypínání se jde pozadu, ale počká se na dokončení načatých transakcí (commit, rollback)
control file - říkáme jaká data tvoří databázi (tabulkové prostory, kódování, soubory…)
alter database parameter=hodnota scope memory|file|both
scope říká jestli se parametr má změnit hned, v paměti (na otestování, jen v téhle instanci), nebo v ini souboru a zavést až následně po restartu nebo obojí
kontrétní hodnotu parametru zjistí
show parameter <parametr>
např. memory_target
zálohovat smí
obnovovat
čím
Pozor