Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dinamicko izvravanje upita upotrebom execute statement

[es] :: Firebird/Interbase :: Dinamicko izvravanje upita upotrebom execute statement

[ Pregleda: 3148 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sosingus

Član broj: 31461
Poruke: 140
*.dynamic.sbb.rs.

Sajt: www.sportin.biz


Profil

icon Dinamicko izvravanje upita upotrebom execute statement27.08.2009. u 23:35 - pre 178 meseci
Imam jedan problem. Koristim FB 1.5 i situacija je sledeca:
Recimo da kao rezultat nekih upita iz procedure... imam nekoliko execute statement naredbi koje npr ovako izgledaju

Code:
execute statement 'create table ' || :my_tbl_name || '(tmp1234 integer)'; 
execute statement 'alter table ' || :my_tbl_name || ' add polje1 integer';
execute statement 'alter table ' || :my_tbl_name || ' add polje2 integer';
execute statement 'alter table ' || :my_tbl_name || ' add polje3 varchar(20)';
execute statement 'alter table ' || :my_tbl_name || ' drop tmp1234';

sve ove naredbe prolaze ali sledeca naredba koja sledi iza njih ne prolazi sa porukom : Tabela ne postoji!?

Code:
s = 'insert into mojanovatabela(POLJE1,POLJE2,POLJE3) select POLJE1, POLJE2, POLJE3 from mojastaratabela where POLJE1 = 1
execute statement s;


Da li neko zna kako bi se ovaj problem mogao resiti?
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
93.86.225.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement28.08.2009. u 08:50 - pre 178 meseci
Problem je u tome sto u istoj transakciji nemozes kreirati tabelu i koristiti je.
Znaci da kreiranje tabela moras uraditi u jednoj SP, pa onda commit, i onda pokreni drugu SP za popunjavanje te tabele.
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement28.08.2009. u 12:24 - pre 178 meseci
Eh, pa i tu je problem, jer Firebird na moju zalost ne podrzava kontrolu transakcija iz procedura...
A meni je neophodno da sve to zavrsim u istoj proceduri...
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
93.86.225.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement28.08.2009. u 13:12 - pre 178 meseci
Uglavnom se problem moze resiti i na drugi nacin, pa ako te ne mrzi opisi malo detaljnije o chemu je rec.
Mozda bi ti externe tabele odradile posao? One verovatno mogu da se kreiraju i koriste unutar iste transakcije, doduse nisam probao.
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement28.08.2009. u 13:47 - pre 178 meseci
Externe tabele, to mi nije bas najprakticnije, ali mozda...

Pravim neki server-side manager, cilj je da odredjenu tabelu koju procedura dobije kao string preslika u drugu tabelu sa drugim nazivom iste strukture kao originalna plus jos neka polja... sve to u kompletu bi radilo da nema eto tog problema za koji verujem da je neki bug u pitanju...besmisleno je dozvoliti kreiranje tabele u execute statement a ne dozvoliti da se u istu tabelu pise uz pomoc istog execute statement-a.

Evo test sluicaj:

Code:
SET TERM ^ ;

CREATE PROCEDURE EXECSTMT_TEST 
as
begin
  execute statement 'create table tmp_tbl(ID1234 integer)';
  if (exists(select * from rdb$relations where RDB$RELATION_NAME = 'TMP_TBL')) then
    execute statement 'insert into tmp_tbl(ID1234) values(0)';
end
^

SET TERM ; ^


Procedura prolazi if uslov (sistemske tabele vide tabelu kreiranu uz pomoc execute statement) i puca na insert-u.
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement30.08.2009. u 13:48 - pre 178 meseci
> Pravim neki server-side manager, cilj je da odredjenu tabelu koju procedura dobije kao string preslika u drugu tabelu sa drugim nazivom iste
> strukture kao originalna plus jos neka polja... sve to u kompletu bi radilo da nema eto tog problema za koji verujem da je neki bug u
> pitanju...besmisleno je dozvoliti kreiranje tabele u execute statement a ne dozvoliti da se u istu tabelu pise uz pomoc istog execute statement-a.

Nije bug, čak je preporučeno posle DDL komandi zatvoriti čitavu konekciju sa bazom i ponovo je startovati. Moj ti je savet da to uradiš iz koda ili iz nekog skripta, ne iz SP.
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement31.08.2009. u 08:43 - pre 178 meseci
Citat:
Nije bug, čak je preporučeno posle DDL komandi zatvoriti čitavu konekciju sa bazom i ponovo je startovati. Moj ti je savet da to uradiš iz koda ili iz nekog skripta, ne iz SP.

Radeci to iz SP resavam vise od jednog problema, jer sa trenutnom arhitekturom aplikacije u kodu ima da ga radim 3 meseca...
Ako nije bug onda nije dobro resenje, jer je transakcija ista i nema razloga da nesto kreirano DDL komandom ne bude dostupno u istoj transakciji.
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
93.86.224.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement31.08.2009. u 13:53 - pre 178 meseci
Citat:
sosingus:Ako nije bug onda nije dobro resenje, jer je transakcija ista i nema razloga da nesto kreirano DDL komandom ne bude dostupno u istoj transakciji.
To je verovatno namerno zabranjeno da bi se sprečile nepredviđene posledice takvog baratanja podacima. Teško je predvideti šta će nekome sve pasti na pamet da menja u sred transakcije.

Ali ja i dalje ne vidim što bi ti bio tako veliki problem da u jednoj transakciji kreiraš tabele, a u drugoj da ih napuniš? Ako baš hoćeš samo jednu SP, dodaj jedan ulazni parametar JelDDL, pa ako SP pozoveš sa JelDDL=1, onda kreira tabele, a ako je 0 onda ih puni.
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
*.dynamic.sbb.rs.

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement31.08.2009. u 21:42 - pre 178 meseci
Pa znas kako firebird je osmisljen tako da je aplikacija ta koja kontrolise transakciju, otud i nije podrzano da se moze upravljati transakcijama iz SP ili trigera. Meni je potrebno da uhvatim podatke nad before update i before delete i napunim privremenu tabelu, to sve moram uraditi u istoj transakciji da mi podatci nebi bili izgubljeni, zapravo ni nemam izbora kako se SP nece ni pozivati iz app...bar se nadam, il cemo da menjamo arhitekturu sw...
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 02:50 - pre 178 meseci
> Meni je potrebno da uhvatim podatke nad before update i before delete i napunim privremenu tabelu, to sve moram uraditi u istoj transakciji da
> mi podatci nebi bili izgubljeni, zapravo ni nemam izbora kako se SP nece ni pozivati iz app...bar se nadam, il cemo da menjamo arhitekturu sw...

Ako su ti potrebne temp tabele onda probaj FB 2.1, on ih podržava. Ako ti ni one ne rešavaju problem, opiši sa malo više detalja šta tačno treba da postigneš...
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 08:13 - pre 178 meseci
Sta pokuisavam da postignem? Pa, evo ovako od pocetka.

Aplikacija zapocinje transakciju i nad nekom tabelom radi update ili delete. Nad tom tabelom postoje definisani "before" trigeri za oba slucaja. Iz trigera se poziva ova procedura koja treba da uradi u sustini kreiranje iste takve tabele, znaci identicne strukture, plus jos neka polja, i da prespe stare podatke iz tabele nad kojom je app radila update ili delete. Znaci cilj je je da se sacuvaju negde stari podatci tabela nad kojima se radi update ili delete, a prema nekim sablonima koje definisem na drugom mestu i ovde sad nisu bitni... zapravo ceo proces je potpuno gotov samo da nemam ovaj problem koji onaj gore test slucaj najbolje demonstrira. Razocaravajuce za mene, ne bi ovako nesto bilo ocekivano od jedne ozbiljne baze. Mada generalno volim firebird, nekad me zaista razocara.

Mozda koriscenje externih tabela sto je schild pomenuo bi moglo na malo drugaciji nacin da resi problem, pogledacu malo vise o tome, il kad bi postojao neki import/export iz xml-a.
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
93.86.224.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 09:32 - pre 178 meseci
Mozda bi mogao te tabele za logovanje kreirati pri konekciji na bazu i onda u trigerima samo punis podacima. E sad, kada bi presao na FB2.1 onda imas OnConnect trigere, pa bi tu mogao kreirati sve te tabele.

Inace, logovanje promena nad tabelama se radi na drugaciji nacin. Ima vise nacina naravno, ja sam resavao sa dve tabele LOGTABLE i LOGFIELDS koje izgledaju ovako:
Code:
CREATE TABLE LOGTABLES (
    ID            BIGINT NOT NULL,      /* autoinc, preko generatora */
    TABNAME       VARCHAR(31) NOT NULL, /* naziv tabele */
    USR           VARCHAR(16) NOT NULL, /* koji user je radio promenu */
    TS            TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, /* vreme promene */
    CHANGE_TYPE   CHAR(1) CHARACTER SET ASCII NOT NULL, /* vrsta promene - I/U/D */
    PRIMARY KEY (ID)
);

CREATE TABLE LOGFIELDS (
    ID            BIGINT NOT NULL,      /* veza ka LOGTABLES.ID */
    FLDNAME       VARCHAR(31) NOT NULL, /* naziv ppolja */
    IS_KEY        SMALLINT DEFAULT 0 NOT NULL,    /* da li je polje primary key */,
    OLD_VALUE     BLOB SUB_TYPE 1 SEGMENT SIZE 32,  /* stara vrednost polja ako je update/delete */
    NEW_VALUE     BLOB SUB_TYPE 1 SEGMENT SIZE 32,  /* nova vrednost polja ako je insert/update */
    IS_BLOB       SMALLINT DEFAULT 0 NOT NULL,  /* da li je polje blob */
    PRIMARY KEY (ID, FLDNAME)
);

Mozes dodati jos neka polja koja ti trebaju u ove tabele, i onda iz njih mozes sa execute statement raditi sta vec hoces.
Ove tabele punis isto trigerima after i/u/d.
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 14:31 - pre 178 meseci
Dobar je ovaj princip ali ti ovde cuvas staru i novu vrednost svakog polja kao BLOB? Mislim da ne moze da se castuje u proste tipove...
Potrebno mi je da stare vrednosti budu ponovo upotrebljive iz neke druge procedure... Pravim nesto kao history manager koji moze podatke da vrati nazad u slucaju greske, a da je pritom maximalno dinamican radi sto manje koda na strani app, a sad sta je tu je, ovakvu strukturu kao sto si predlozio mogu malo da izmenim i dodam po jedno polje za svaki tip podatka dostupan u FB... jos cu razmisliti...
Hvala ti puno na predlogu :)
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 17:09 - pre 178 meseci
> Aplikacija zapocinje transakciju i nad nekom tabelom radi update ili delete. Nad tom tabelom postoje definisani "before" trigeri za oba slucaja. Iz
> trigera se poziva ova procedura koja treba da uradi u sustini kreiranje iste takve tabele, znaci identicne strukture, plus jos neka polja, i da prespe stare
> podatke iz tabele nad kojom je app radila update ili delete. Znaci cilj je je da se sacuvaju negde stari podatci tabela nad kojima se
> radi update ili delete, a prema nekim sablonima koje definisem na drugom mestu i ovde sad nisu bitni.

Triggeri se okidaju za svaki promenjeni ili obrisani slog, znači li to da ti posle svake takve promene praviš novu tabelu, novog naziva i kopiraš u nju čitav sadržaj, zašto ne kopiraš samo izmenjeni slog?
Inače, za svime ovime nema potrebe, pogledaj principe po kojima radi sistem za replikaciju, ima i detaljnih tekstova o tome.
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement01.09.2009. u 17:31 - pre 178 meseci
savkic, koliko sam shvatio replikacija je nešto slično kao RAID polje sa diskovima. Šta se time dobiva, da li se pamte svi podaci (delete/update) ili kako? Hvala!
F
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement02.09.2009. u 08:34 - pre 178 meseci
>Triggeri se okidaju za svaki promenjeni ili obrisani slog, znači li to da ti posle svake takve promene praviš novu tabelu, novog naziva i kopiraš u nju čitav sadržaj, zašto ne >kopiraš samo izmenjeni slog?

Ne, naravno da ne pravim novu tabelu za svaki izmenjeni slog. Kreiram kopiju strukture tabele ako vec ne postoji i u nju ubacim stare podatke zajedno sa jos nekoliko polja koja se kasnije koriste za laksu manipulaciju izmena - uocavanje celine neke promene.

>Inače, za svime ovime nema potrebe, pogledaj principe po kojima radi sistem za replikaciju, ima i detaljnih tekstova o tome.

Replikacija nije resenje. Znas kako, svaka app ima svoje specificnosti, znaci ne idu triggeri na svaku tabelu nego idu na pojedine tabele, dalje definisem "sablone" aplikacije, odnosno sta je to sto cini neku celinu. Onda ovaj manager zna da odredi sta je to sve sto cini neku celinu i da je kao takvu sacuva. Zato dodajem neka extra polja u te dinamicki kreirane tabele.
Znaci npr ako imam bazu za neke igre i imam tabelu GAME i GAME_DETAILS ja necu staviti triggere za ovu svrhu nad obe tabele samo nad GAME iako ce se stari podatci snimiti i za GAME i za GAME_DETAILS

Na kraju krajeva nije uopste bitno sta pravim, bitno je zasto test slucaj nece da radi iako je ocekivano da ce raditi jer je nekako ta operacija osnovna. Sad, razmisljam da sve ovo smestim u dve velike staticne tabele slicno onome sto je schild predlozio samo da dodam po jedno polje za svaki tip. Neke druge stvari su me odvukle od ovoga ali vraticu se, taman imam i ovde misljenja da cujem :)
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement02.09.2009. u 14:07 - pre 177 meseci
> koliko sam shvatio replikacija je nešto slično kao RAID polje sa diskovima. Šta se time dobiva, da li se pamte svi podaci (delete/update) ili kako? Hvala!

To je način da više fizički odvojenih baza budu sinhronizovane, npr promene na lokaciji A (insert, update, delete) će biti preslikane i na lokaciju B.

> Ne, naravno da ne pravim novu tabelu za svaki izmenjeni slog. Kreiram kopiju strukture tabele ako vec ne postoji i u nju ubacim stare podatke zajedno sa jos

Onda nije neophodno da se to radi iz SP, te dodatne tabele praviš jedanputa i to možeš učiniti zajedno sa osnovnim tabelama.

> Replikacija nije resenje. Znas kako, svaka app ima svoje specificnosti, znaci ne idu triggeri na svaku tabelu nego idu na pojedine tabele,
> dalje definisem "sablone" aplikacije, odnosno sta je to sto cini neku celinu.

Principi su isti, ti želiš da tabele dovedeš u neko prethodno stanje, replikacija dovodi tabele u novo stanje, razlika je samo u podacima koji se čuvaju (NEW.POLJA ili OLD.POLJA).
 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement02.09.2009. u 14:40 - pre 177 meseci
>> Ne, naravno da ne pravim novu tabelu za svaki izmenjeni slog. Kreiram kopiju strukture tabele ako vec ne postoji i u nju ubacim stare podatke zajedno sa jos

>Onda nije neophodno da se to radi iz SP, te dodatne tabele praviš jedanputa i to možeš učiniti zajedno sa osnovnim tabelama.

Ali, ja hocu da to bude dinamicno i podesivo da se ne koristi uopste u kom slucaju mi tabele uopste ne trebaju. Ako cu da cuvam jos jedanput iste strukture to znaci da moram i da ih odrzavam konzistentinim, ako je dinamicno na kraju je manje posla...

>> Replikacija nije resenje. Znas kako, svaka app ima svoje specificnosti, znaci ne idu triggeri na svaku tabelu nego idu na pojedine tabele,
>> dalje definisem "sablone" aplikacije, odnosno sta je to sto cini neku celinu.

>Principi su isti, ti želiš da tabele dovedeš u neko prethodno stanje, replikacija dovodi tabele u novo stanje, razlika je samo u podacima koji se čuvaju (NEW.POLJA ili OLD.POLJA).

Zapravo, samo set podataka se presipa ne cele tabele to je kljucna razlika, i ne sve tabele. npr celina je 1 record u GAME tabeli i N records u GAME_DETAILS tabeli a te dve su povezane preko kljuca...
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
93.86.224.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement03.09.2009. u 09:57 - pre 177 meseci
Citat:
Dobar je ovaj princip ali ti ovde cuvas staru i novu vrednost svakog polja kao BLOB? Mislim da ne moze da se castuje u proste tipove...

U samom triggeru gde puniš tabelu LOGFIELDS, castuješ aktuelno polje as varchar(x), gde vrednost x treba da je koliko to polje zauzima karaktera, ili staviš recimo za brojne tipove i datumske cast(new.nazivpolja as varchar(32)), a za tekstualna polja bi mogao saznati dužinu preko sistemskih tabela.
Kad budeš posle vraćao ta polja u tabelu, firebird će ih sam prepoznati kako treba (pošto ih je on konvertovao u text, znaće da ih konvertuje i iz teksta u broj/datum...).

Treba malo zezanja sa rdb$... tabelama, ali se može, i provereno radi :)

 
Odgovor na temu

sosingus

Član broj: 31461
Poruke: 140
91.150.115.*

Sajt: www.sportin.biz


Profil

icon Re: Dinamicko izvravanje upita upotrebom execute statement03.09.2009. u 10:23 - pre 177 meseci
Super predlog, to bi mi ovu tabelu ostavilo sa svega nekoliko polja za tipove. Hvala!
 
Odgovor na temu

[es] :: Firebird/Interbase :: Dinamicko izvravanje upita upotrebom execute statement

[ Pregleda: 3148 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.