Nedienas ar oracle! Jānis Rubļevskis (koko) / 10.11.2005. 16:54 / #Datori / 5 komentāri

Šodien esmu noņēmies nereāli ar Oracle temporālas datubāzes veidošanu. Visriebīgākais ir tas, ka viss pilnīgi ir pabeigts, izņemot viena triggerīša ieviešanu relāciju objektu datu bāzes laukiem, kas satur objektu tabulas. Nu kaut vai mirsti nost, bet nesanāk...

Ja jūties ļoti advancēts Oracle datu bāzu projektēšanā vai vismaz triggerošanā, tad lasi turpinājumu.

Tātad - ir man divi objektu tipi:

CREATE OR REPLACE TYPE alga_tips AS OBJECT(

alga NUMBER(7,2),

l_no DATE,

l_lidz DATE);

un
CREATE OR REPLACE TYPE objekts_tips AS OBJECT(

objekts NUMBER(7,2),

l_no DATE,

l_lidz DATE);

No šiem objektu tipiem ir uztaisītas divas objektu tabulas:
CREATE OR REPLACE TYPE alga_tab AS TABLE OF alga_tips;

CREATE OR REPLACE TYPE objekts_tab AS TABLE OF objekts_tips;

Tālāk tiek izveidota relāciju objektu datu tabula:
CREATE TABLE pidari(

id NUMBER,

vards VARCHAR2(25),

uzvards VARCHAR2(30),

alga_s alga_tab,

objekts_s objekts_tab)

NESTED TABLE alga_s STORE AS b_al_iev,

NESTED TABLE objekts_s STORE AS b_ob_iev;

Tagad mums gribētos ieviest trigerīti, kas moderēs, lai nepareizus datus nevarētu ielikt tabulā, bet te arī es apstājos - piemērā būs redzams kā var apstrādāt parastus relāciju datus, bet kā tikt pie objektu datiem, es neiebraucu!
CREATE OR REPLACE TRIGGER check_data

AFTER INSERT OR UPDATE ON buvuzraugi

FOR EACH ROW

BEGIN

IF ((:new.vards IS NULL) OR (:new.uzvards IS NULL)) THEN

DBMS_OUTPUT.put_line('Vaards vai uzvaards nav pareizs');

RAISE_APPLICATION_ERROR(-20000, 'Proceduura tika paartraukta!');

END IF;

END;

.

RUN;

Ir varianti kā man nomoderēt objektu alga_s un objekts_s laukus?


Komentāri:

koko @ 22.05.2006. 16:03

Paldies! Tagad zināsim!
A vajadzīgs bija tāpēc, ka tāds bija uzdevums :)

chupit @ 22.05.2006. 15:35

Sveiks,

Nezinu vai tas joprojam ir aktuāli, bet tomēr nolēmu atbildēt. Nested tabula iekš triggera/plsql ir parasta kolekcija, tāpēč, lai izmantotu alga_s tev vienkārši ir jāuzraksta for cilpu, kas izies cauri visai kolekcijai. Piemēram:

CREATE OR REPLACE TRIGGER check_data
AFTER INSERT OR UPDATE ON pidari
FOR EACH ROW
BEGIN
for i in :new.alga_s.first .. :new.alga_s.last loop
DBMS_OUTPUT.put_line(:new.alga_s(i).alga);
end loop;
END;

Nu un protams pirmais jautājums kuru ir jāuzdod ir, kāpēc vispār tas viss ir vajadzīgs? :)

Ar cieņu,
Edgars

koko @ 12.12.2005. 12:44

Lai nodotu laboriņu - tāda jēga!

kroms @ 12.12.2005. 11:36

Kāda jēga no šāda trigera, kurš izsauc error pēc inserta vai updeita?

tm @ 11.11.2005. 05:58

asktom.oracle.com


Nu pasāpini mani - tu jau gribi:

* Visi lauki (izņemot tavu lapu) aizpildāmi obligāti!
E-pasts publiski netiks parādīts.
Zinot vairākumu, komentāros tagi netiek atrādīti kā tagi. Linki automātiski pārveidosies par spiežamiem (cerams).
Bloga īpašnieks patur tiesības ļaunus komentārus dzēst vai pārveidot cilvēkiem patīkamākā formā, bet tajā pašā laikā neatbild par komentāru saturu.