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

ispisivanje kolone bez poznavanja imena kolone

[es] :: Oracle :: ispisivanje kolone bez poznavanja imena kolone

[ Pregleda: 3511 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.adsl.xtra.co.nz.



+3 Profil

icon ispisivanje kolone bez poznavanja imena kolone02.02.2007. u 02:30 - pre 209 meseci
Hteo bih nesto kao SELECT kolona_3 FROM tabela;
da li postoji neki keyword da ga stavim umesto kolona_3 tako da mi prikaze trecu kolonu iz tabele "tabela"?

Da li postoji nacin da izlistam imena kolona iz rezultata neke SELECT naredbe?
Recimo ako imam nesto kao SELECT a, aa, aaa, b, bb, bbb FROM A,B
hteo bih da izlistam imena kolona tj hocu da mi ispise u koloni a, aa, aaa, b, bb i bbb.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone02.02.2007. u 16:50 - pre 209 meseci
Srki, morao bi da budeš malo detaljniji kada nešto pitaš. Nije mi baš najjasnije šta si hteo, ali da pokušam da ti odgovorim.

1. Ne možeš da koristiš u SELECTu poziciju umesto imena kolone. Pozicija može da se koristi samo u ORDER BY klauzuli (na primer, ORDER by 3, 2, 1 ASC) mada se ovakav način korišćenja ne preporučuje. Pitanje je i da li u bazi A u tabeli X i u bazi B u istoj tabeli kolone imaju isti redosled. Oslanjanje na tu pretpostavku smatra se lošim stilom programiranja i često vodi u greške. Ono što možeš, to je da se izrazima u select klauzuli daju alijasi, na primer:

select a col_01, b col_02
from xyz

tako da znaš unapred kako se zove koja kolona.

Ovo je naročito preporučljivo (davanje aliasa) kada radiš JOIN dve tabele koje mogu imati kolone sa istim nazivima, tako da bude jasno po imenu iz koje tabele potiče kolona.

2. U kom jeziku ti ovo treba. Na primer u PRO*C-u imaš kod dinamičkog programiranja mogućnost da nad dinamičkim SQL upitu uradiš DESCRIBE, pa da u SQLDA strukturi (SQL Dynamic Area) dobiješ nazive i tipove kolona. Naravno, za druga okruženja postoje druga rešenja, tako da ne znam da li sam ti odgovorio na pitanje.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone03.02.2007. u 01:20 - pre 209 meseci
Citat:
djoka_l: 1. Ne možeš da koristiš u SELECTu poziciju umesto imena kolone. Pozicija može da se koristi samo u ORDER BY klauzuli (na primer, ORDER by 3, 2, 1 ASC) mada se ovakav način korišćenja ne preporučuje. Pitanje je i da li u bazi A u tabeli X i u bazi B u istoj tabeli kolone imaju isti redosled.

A sta ako mi nije bitan redosled, da li je onda moguce to uraditi? I ovo treba da uradim nad jednom SELECT naredbom tako da cu znati unapred koja je koja kolona. Taj SELECT query je napravljen dinamicki, postoji dosta slicnih i ovo sto pravim treba da radi na svim tim upitima.

Citat:
select a col_01, b col_02
from xyz

Ne mogu to da radim jer mi je bitno da mi imena kolona budu razlicita (jer to prikazujem na nekom grafu i ne znam napamet imena kolona nego se query prosledjuje tom report-u koji pravi graph).

Citat:
2. U kom jeziku ti ovo treba. Na primer u PRO*C-u imaš kod dinamičkog programiranja mogućnost da nad dinamičkim SQL upitu uradiš DESCRIBE, pa da u SQLDA strukturi (SQL Dynamic Area) dobiješ nazive i tipove kolona. Naravno, za druga okruženja postoje druga rešenja, tako da ne znam da li sam ti odgovorio na pitanje.


Ovo pitanje sam postavio da bih pomocu njega mogao da dodjem do resenja za prvo pitanje. Kako u PL/SQL-u da uradim DESCRIBE nad dinamickim SELECT upitom? Ako to znam onda mi je lako da nadjem resenje za prvo pitanje.

3. Da li postoji nacin da redove pretvorim u kolone ali bez poznavanja imena kolona jer toj proceduri hocu da prosledim ime tabele i treba da radi za bilo koju tabelu? Ako postoji resenje za 2. pitanje onda je lako resiti i ovo 3. pitanje.

Hvala ti na zelji da mi pomognes.

[Ovu poruku je menjao srki dana 21.02.2007. u 11:42 GMT+1]
 
Odgovor na temu

dragancesu
subotica

Član broj: 38340
Poruke: 2189
*.eunet.yu.



+73 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone03.02.2007. u 22:30 - pre 209 meseci
Oracle sve podatke o tabelama i kolonama cuva u sistemskim tabelama gde ces naci strukture tabela, indeksa i slicno. Za ovo sto trazis mozda bi ti bilo resenje da pogledas nesto kao ALL_COLUMNS ili ALL_TAB_COLUMNS. Pomalo se menja sa verzijom pa pogledaj u administraciju.

Pomozite Micro$oftu u borbi protiv piraterije, poklonite prijatelju Linux
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone03.02.2007. u 23:52 - pre 209 meseci
Nazalost ne mogu to da koristim jer meni trebaju imena kolona od rezultata select naredbe a ne direktno imena kolona od tabela koje su u bazi.
 
Odgovor na temu

bigjatovic
Bozidar Ignjatovic
Nis

Član broj: 7134
Poruke: 20
*.dynamic.sbb.co.yu.



Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone04.02.2007. u 01:34 - pre 209 meseci
Citat:
srki: Nazalost ne mogu to da koristim jer meni trebaju imena kolona od rezultata select naredbe a ne direktno imena kolona od tabela koje su u bazi.

Zasto ne procitas imena kolona direktno iz select klauzule?
Tu moraju da budu navedena imena kolona bez obzira na to da li koriste ili ne koriste aliase.

BIgnjatovic
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone04.02.2007. u 12:14 - pre 209 meseci
Citat:
bigjatovic: Zasto ne procitas imena kolona direktno iz select klauzule?

Zato sto bi da ih u stored proceduri prosledim kao ref cursor. Treba mi nesto sto bi mi vratilo tabelu sa nazivima kolona da bih to koristio na frontendu pisan u Javi. Druga stvar je sto hocu da resim 1. i 3. pitanje a ako bih mogao da izlistam imena kolona i da ih stavim u tabelu ili neke promenjive u PL/SQL-u onda bih to mogao da resim.
 
Odgovor na temu

dusanmiloradovic
Dusan Miloradovic
Abu Dabi

Član broj: 38080
Poruke: 45
*.emirates.net.ae.



Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 04:53 - pre 209 meseci
Posto vec to pises u javi, najlakse ti je da koristis metod getMetaData() klase ResultSet.
Recimo da si prosledio rezultate upita preko ref cursora do ResultSet-a sa imenom rs.

ResultSetMetaData md=rs.getMetaData();
for (int i=0;i<md.getColumnCount();i++){
System.out.println(md.getColumnName(i));
}

Dusan
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 05:55 - pre 209 meseci
Hvala. Da li postoji nacin da isto uradim u PL/SQL-u? Treba mi da napravim ResultSet koji ce da mi ima imena kolona umesto vrednosti.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 08:15 - pre 209 meseci
Eureka! Na dnu ove stranice je resenje:

http://www.oracle.com/technolo...ag/oracle/06-may/o36plsql.html

 
Odgovor na temu

dusanmiloradovic
Dusan Miloradovic
Abu Dabi

Član broj: 38080
Poruke: 45
*.emirates.net.ae.



Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 08:28 - pre 209 meseci
Koliko znam, ne postoji jednostavan nacin.
Mozes recimo da napravis temporary tabelu imena_kolona koja ce imati 2 kolone: redni_broj i ime_kolone.
Prilikom kreiranja dinamickog upita, ubacujes imena kolona u tu tabelu sa odgovarajucim rednim brojem.
PL/SQL ti omogucava da vratis 2 ref-cursora iz procedure. Otvoris jedan kao select * from imena_kolona,
a drugi kao tvoj dinamicki upit.

Pitanje je samo, zasto bi ovo radio?
Ako sam ja dobro shvatio, dinamicki se kreira upit iz pl/sql-a ,potrebno je samo znati imena kolona zbog prikaza.
Ako vratis ref-cursor iz pl/sql-a javi, dobices ResultSet sa podacima, koji ce istovremeno sadrzati sva imena kolona
iz upita koji si izvrsio u pl/sql-u. Nacin da procitas ta imena kolona sam ti vec rekao. Mozda nesto nisam dobro shvatio sto
se tice problema koji imas?
 
Odgovor na temu

dusanmiloradovic
Dusan Miloradovic
Abu Dabi

Član broj: 38080
Poruke: 45
*.emirates.net.ae.



Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 08:31 - pre 209 meseci
Inace, ovaj primer koji si vratio ti radi za obican, a ne za ref cursor.
Obican cursor ne mozes da prosledis javi, samo ref cursor
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
..lecom.global-gateway.net.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone05.02.2007. u 09:14 - pre 209 meseci
Citat:
dusanmiloradovic
Pitanje je samo, zasto bi ovo radio?

Zato sto hocu da u BIRT reportu stavim da je na x osi jedna kolona (gde su u stvari vrednosti kolona koje mi trebaju) a na y osi druga kolona (koja predstavlja vrednosti iz prvog reda jednog select queryija).

Citat:
Nacin da procitas ta imena kolona sam ti vec rekao. Mozda nesto nisam dobro shvatio sto
se tice problema koji imas?

Ma znao sam za to iz jave ali me je mucio ovaj report ali ne samo to. Hteo sam da napisem proceduru koja mi vraca tabelu gde su kolone i vrste zamenile mesta. Takodje treba mi jedna procedura gde mogu da selektujem redni broj kolone jer ne znam unapred ime te kolone, u pitanju je neki glomazan dinamicki sql koji nisam ja pravio i rezultat te select naredbe zavisi od nekih dvadesetak parametara. Tako npr. ako customer posalje upit da vidi neke transakcije onda ce mu recimo 5. kolona predstavljati imena radnji gde je nesto kupovao a ako merchant pozove istu proceduru onda ce mu 5. kolona predstavljati imena musterija i imena kolona ce biti drugacija a meni je bilo bitno da saznam i imena kolona za report a takodje sam hteo da napravim resenje za 1. i 3. pitanje jer mi i to cesto treba. Prekosutra cu ici na posao pa cu da posaljem kada to odradim, nemam ovde kod kuce oracle.

Citat:
[url=/p1458617]Inace, ovaj primer koji si vratio ti radi za obican, a ne za ref cursor.

Ma nema veze, makar znam kako da napravim ref cursor koji mi vraca imena kolona pa da prosledim BIRT-u.
 
Odgovor na temu

bigjatovic
Bozidar Ignjatovic
Nis

Član broj: 7134
Poruke: 20
*.dynamic.sbb.co.yu.



Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone17.02.2007. u 22:18 - pre 209 meseci
Da li si nasao resenje? Ako jesi podeli to sa nama posto nas sve zanima :)))
Pozdrav
BIgnjatovic
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.adsl.xtra.co.nz.



+3 Profil

icon Re: ispisivanje kolone bez poznavanja imena kolone21.02.2007. u 05:57 - pre 208 meseci
Da, samo nisam imao vremena da posaljem, dosta sam zauzet ovih dana.

Dole je na brzinu sklepano resenje ali prvo da vidimo sta je problem. Recimo da imamo query:
Code:
SELECT sum(purchase) as  Potroseno, sum (depozit) as Zaradjeno, sum (taksa) as Porez FROM Transakcije

rezultat ce biti:
Code:

Potroseno     Zaradjeno     Porez
---------------------------------
1234.56         43.21        77.5


Ovo ne mozemo da koristimo u izvestajima u Birt dizajneru jer nam treba da jednu kolonu stavimo za X osu a drugu za Y da bismo mogli npr. da na X osi imamo Potroseno i Zaradjeno a na Y osi vrednosti. To znaci da nama treba ovakva tabela:

Code:

Field            Value
----------------------
Potroseno      1234.56
Zaradjeno        43.21
Porez            77.5


pa u Birt-u mozemo da stavimo da je na X osi [Field] a na Y osi [Value].

Evo koda za funkciju fn_row_to_column koju sam uspeo da napravim zahvaljujuci tome sto sam na onom sajtu video kako da saznam imena kolona u dinamickom queryiju.

Code:

DROP TYPE field_value_table_type;

CREATE OR REPLACE TYPE field_value_row_type AS OBJECT (
  Field              VARCHAR2(30),
  Value                 VARCHAR2(30)
  );


CREATE OR REPLACE TYPE field_value_table_type AS TABLE OF field_value_row_type;

CREATE OR REPLACE FUNCTION fn_row_to_column (
p_query                    VARCHAR2)
  RETURN field_value_table_type PIPELINED AS
col_name_temp varchar2(4000);              --current column name
value_temp NUMBER;                          --current value
l_statement1 VARCHAR2 (4000);
l_statement2 VARCHAR2 (4000);
l_sql_whole  VARCHAR2(4000);
l_cursor PLS_INTEGER := DBMS_SQL.open_cursor;
cur PLS_INTEGER := DBMS_SQL.open_cursor;
l_columns DBMS_SQL.desc_tab2;
l_numcols PLS_INTEGER;
l_field VARCHAR(30);
l_value VARCHAR2 (30);
l_feedback PLS_INTEGER;
indx PLS_INTEGER:=1;
BEGIN
  -- Parse the query.
  DBMS_SQL.parse ( l_cursor, p_query, DBMS_SQL.native );
  -- Retrieve column information
  DBMS_SQL.describe_columns2 ( l_cursor, l_numcols, l_columns );
  -- Define each of the column names
  FOR colind IN 1 .. l_numcols
  LOOP
  -- Specify maximum size of the string being retrieved.
  DBMS_SQL.define_column ( l_cursor, colind, l_value, 30 );
  END LOOP;
  -- Now execute the query....
  l_feedback := DBMS_SQL.EXECUTE ( l_cursor );
  l_statement1:='DECODE(rownum';
  l_statement2:='DECODE(rownum';
  LOOP
          EXIT WHEN DBMS_SQL.fetch_rows ( l_cursor ) = 0;
          FOR colind IN 1 .. l_numcols
               LOOP
               -- Retrieve each value.
                          DBMS_SQL.COLUMN_VALUE ( l_cursor, colind, l_value );
                        l_statement1:=l_statement1 || ',' || indx || ',' || '''' || l_columns(colind).col_name || '''';
                        l_statement2:=l_statement2 || ',' || indx || ',' || l_value;
                        indx:=indx+1;
            END LOOP;
  END LOOP;
  l_sql_whole:='SELECT ' || l_statement1 || ') AS Field,' || l_statement2  || ') AS Value FROM (' || p_query || ') CONNECT BY ROWNUM <=' || l_numcols;

  -- Cleanup
  DBMS_SQL.close_cursor ( l_cursor );

  DBMS_SQL.parse ( cur, l_sql_whole, DBMS_SQL.native );

  FOR colind IN 1 .. 2
  LOOP
  DBMS_SQL.define_column ( cur, colind, l_value, 30 );
  END LOOP;

  l_feedback := DBMS_SQL.EXECUTE ( cur );
  LOOP
      EXIT WHEN DBMS_SQL.fetch_rows ( cur ) = 0;
    DBMS_SQL.COLUMN_VALUE ( cur, 1, l_field );
    DBMS_SQL.COLUMN_VALUE ( cur, 2, l_value );
    PIPE ROW(field_value_row_type(l_field, l_value));
  END LOOP;
  RETURN;
END;


Startujte ovu gore skriptu i onda mozete to da koristite u Birt ili bilo gde drugde na ovakav nacin:

Code:
SELECT * FROM TABLE(fn_row_to_column('SELECT sum(purchase) as  Potroseno, sum (depozit) as Zaradjeno, sum (taksa) as Porez FROM Transakcije'))

i to nam vrati onu tabelu koju smo hteli. Ako nekome nije jasno kako ovaj moj kod radi mogu kasnije da ga pojasnim.
 
Odgovor na temu

[es] :: Oracle :: ispisivanje kolone bez poznavanja imena kolone

[ Pregleda: 3511 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

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