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

sql upit

[es] :: Oracle :: sql upit

[ Pregleda: 6424 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon sql upit10.05.2005. u 12:52 - pre 229 meseci
Primer
sat varchar2(10);
kolona sat ima vrednosti oblika
01.03.04
23.09.2005
22.kw
stop
21/12/02
......

Kako selektirati iz kolone sat koja je tipa varchar2 ''select to_date(sat,'dd.mm.yyyy') from tabela;'' samo one vrednosti koje se mogu
pretvoriti u tip datum.
Znaci bez npr.22.kw, stop,.....
nn
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: sql upit10.05.2005. u 21:57 - pre 229 meseci
Ako ima tabelu PROBA u kojoj imas kolonu koja se zove A
onda je upit sledeci:

select decode(length(a),
8, decode (substr(a, 3, 1),
'.', decode (substr(a, 6, 1),
'.', a,
'nije datum'),
'/', decode (substr(a, 6, 1),
'/', a,
'nije datum'),
'nije tacka ni slash 8'),
10, decode (substr(a, 3, 1),
'.', decode (substr(a, 6, 1),
'.', a,
'nije datum'),
'/', decode (substr(a, 6, 1),
'/', a,
'nije datum'),
'nije tacka ni slash 10'),
'nije datum bre') samo_datumi
from proba;

Ako malo bolje pogledas videces da ovaj upit obradjuje sledece formate datuma

DD.MM.YY
DD.MM.YYYY
DD/MM/YY i
DD/MM/YYYY

ja sam ti dao ideju a ti ako imas jos neki format onda ga samo dodaj u upit.
Ovaj upit ima svojih nedostataka, ali da bi radio 100% kako treba onda bi bilo
previse komplikovano da se ispitaju svi slucaji karaktera koji se pojavljuju u podatku.
Nije nemoguce, ali sada nemam vremena da se bakcem sa tim.
Inace ako nije preko potrebno datume uvek smestaj u polja DATE, TIMESTAMP i sl. da ne bi morao da radis ovo sto sada radis. Ovo vrlo lako moze da se uradi preko funkcije/procedure (nekoliko linija), ali iz upita je malo komplikovanije.

Toliko.


// Edit by StRiPy: Dodan PRE tag radi bolje preglednosti.

[Ovu poruku je menjao StRiPy dana 11.05.2005. u 13:49 GMT+1]
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: sql upit10.05.2005. u 22:13 - pre 229 meseci
Evo ti kod za funkciju u paketu koja moze da lepo resi ovaj problem. Ovo je zamena za funkciju to_date kada ne znas kakvi su formati datuma sa kojima radis i koje treba da konvertujes.

create or replace package todate_pkg
as
function thedate
( p_string in varchar2 )
return date;
end;


create or replace package body todate_pkg
as

type fmtArray is table of varchar2(30);

g_fmts fmtArray :=
fmtArray( 'dd-mm-rr', 'dd/mm/rr',
'dd.mm.rr', 'mon-dd-rr',
'dd-mon-rrrr' );

function thedate( p_string in varchar2 )
return date
is
return_value date;
begin
for i in 1 .. g_fmts.count
loop
begin
return_value := to_date(p_string,g_fmts(i) );
exit;
exception
when others then null;
end;
end loop;

if ( return_value is null ) then
raise PROGRAM_ERROR;
end if;
return return_value;
end;
end;

Sve formate koje hoces da budu obradjeni treba da spakujes u polje g_fmts i to ima da radi kako treba inace ovo moze da se koristi na mnogo razlicitih mesta, jedno od najupotrebljivijih je SQL Loader kada neko smesti svakojako djubre u kolonu i kada ne mozes da obradis sve odjednom.

Toliko


// Edit by StRiPy: Dodan pre tag radi bolje preglednosti.


[Ovu poruku je menjao StRiPy dana 11.05.2005. u 13:48 GMT+1]
 
Odgovor na temu

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon Re: sql upit11.05.2005. u 07:47 - pre 229 meseci
Raspucin puno hvala na odgovorima
pozdrav

[Ovu poruku je menjao Ninobos dana 11.05.2005. u 10:51 GMT+1]
nn
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: sql upit11.05.2005. u 08:07 - pre 229 meseci
Nema problema,

Pozdrav
 
Odgovor na temu

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon Re: sql upit11.05.2005. u 09:52 - pre 229 meseci
jos jedno pitanje:ineresuje me da li moze ulazni parametar funkcije da bude kolona iz tabele a da funkcija vrati sve vrednosti konvertovane u format datum (znaci njih vise)

nn
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
*.rcub.bg.ac.yu.

ICQ: 244452581


+3 Profil

icon Re: sql upit11.05.2005. u 10:23 - pre 229 meseci
Moze i to vrlo jednostavno.

Funkcija ce vracati REF CURSOR a inace onaj upit koji sam ti poslao ces camo malo da modifikujes i da prilagodis sintaksi:

OPEN ... FOR SELECT .... USING ime_kolone.

Ako se ne snadjes napisacu ti kasnije sada nemam vremena.

Pozdrav
 
Odgovor na temu

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon Re: sql upit11.05.2005. u 10:40 - pre 229 meseci
Ok,pa ako budes imao vremena napisi mi jer sam pocetnik sa dimackim sql_om.
nn
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: sql upit11.05.2005. u 14:54 - pre 229 meseci
Citat:
Ninobos: Ok,pa ako budes imao vremena napisi mi jer sam pocetnik sa dimackim sql_om.


O tome se i radi, sedi i uci, to nije nista komplikovano a dosta se primenjuje, osim ako ne nameravas da do penzije budes pocetnik. Evo ti procedura:

create or replace procedure samo_datumi(tabela in varchar2, kolona in varchar2, datum out sys_refcursor)
as
datumi sys_refcursor;
begin
open datumi for
'select decode(length('||kolona||'),'
||'8, decode (substr('||kolona||', 3, 1), '
||' ''.'', decode (substr('||kolona||', 6, 1),'
||' ''.'', '||kolona||', '
||' ''nije datum'' ),'
||' ''/'', decode (substr('||kolona||', 6, 1), '
||' ''/'', '||kolona||', '
|| ' ''nije datum''), '
|| ' ''nije tacka ni slash 8''),'

||'10, decode (substr('||kolona||', 3, 1), '
||' ''.'', decode (substr('||kolona||', 6, 1),'
||' ''.'', '||kolona||', '
||' ''nije datum''),'
||' ''/'', decode (substr('||kolona||', 6, 1), '
||' ''/'', '||kolona||', '
|| ' ''nije datum''), '
|| ' ''nije tacka ni slash 10''),'
||' ''nije datum bre'') dat from '||tabela ;
datum:=datumi;
end;



a evo ti kod za pozivanje iste:


declare
b sys_refcursor;
datum varchar2(30);
broj number;
begin
samo_datumi('proba', 'a', b);
loop
fetch b into datum;
exit when b%notfound;
dbms_output.put_line('datum je:'||datum);
end loop;
end;



Toliko,

Pozdrav

// Edit by StRiPy: Dodan PRE tag radi bolje preglednosti.
 
Odgovor na temu

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon Re: sql upit11.05.2005. u 16:05 - pre 229 meseci
napisao sam jednu funkciju ali ne radi

type t_RefCur is REF CURSOR;

function datum1 (sema in varchar2,tabela in varchar2,kolona in varchar2) return t_RefCur is

datumi t_RefCur;
v_sql varchar2(500);

begin

v_sql := 'select decode(length('||cspalte||'),'
||'8, decode (substr('||cspalte||', 3, 1), '
||' ''.'', decode (substr('||cspalte||', 6, 1),'
||' ''.'', '||cspalte||', '
||' ''nije datum'' ),'
||' ''/'', decode (substr('||cspalte||', 6, 1), '
||' ''/'', '||cspalte||', '
|| ' ''nije datum''), '
|| ' ''nije tacka ni slash 8''),'

||'10, decode (substr('||cspalte||', 3, 1), '
||' ''.'', decode (substr('||cspalte||', 6, 1),'
||' ''.'', '||cspalte||', '
||' ''nije datum''),'
||' ''/'', decode (substr('||cspalte||', 6, 1), '
||' ''/'', '||cspalte||', '
|| ' ''nije datum''), '
|| ' ''nije tacka ni slash 10''),'
||' ''nije datum bre'') dat from '||cowner||'.'||ctabelle;

open datumi for v_sql using sema,tabela,kolona;
return datumi;

end datum1;

potrebna mi je funkcija da bi se lakse koristila u drugom query_ju
sta mislis gde je greska

// Edit by StRiPy: Dodan PRE tag radi bolje preglednosti.
nn
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: sql upit11.05.2005. u 22:37 - pre 229 meseci
Citat:

potrebna mi je funkcija da bi se lakse koristila u drugom query_ju


ovo te ne razumem, sta hoces.


Citat:

sta mislis gde je greska


ovako napamet bez testiranja vidim dve greske.

Prva je:

Citat:

type t_RefCur is REF CURSOR;


deklaracija REF CURSOR-a treba da bude u paketu inace nece da radi (mozda si ovo i uradio, ali nisi ovde napisao). To je jedno resenje problema. Drugo je da se koristi SYS_REFCURSOR koji moze da radi bez deklaracije u paketu....

Druga je:

Citat:

open datumi for v_sql using sema,tabela,kolona;


USING se koristi kada se koriste BIND promenljive i to uglavnom za slucajeve poredjenja vrednosti koje se menjaju sa vrednostima iz kolone neke tabele ali ne i u ovom slucaju kada se ubacuje ime tabele i kolone.
sto znaci ide prethodna linija koda ide bez klauzule USING:

open datumi for v_sql;

Evo ti jedan primer iz dokumentacije:

DECLARE
TYPE EmpCurTyp IS REF CURSOR; -- define weak REF CURSOR type
emp_cv EmpCurTyp; -- declare cursor variable
my_ename VARCHAR2(15);
my_sal NUMBER := 1000;
BEGIN
OPEN emp_cv FOR -- open cursor variable
’SELECT ename, sal FROM emp WHERE sal > :s’ USING my_sal;
...
END;

Nadam se da shvatas poentu. Znaci ne mozes umesto npr. kolone sal da stavis BIND promenljivu i da nastavis dalje.

Nesto ovako moze da prodje:

EXECUTE IMMEDIATE ’INSERT INTO ’ || tab_name ||
’ VALUES (:1, :2)’ USING p, h;

ali ne i nesto ovako:

EXECUTE IMMEDIATE ’INSERT INTO :1 VALUES (:2, :3)’ USING p, h, m;

Valjda si shvatio.


Toliko,

Pozdrav
 
Odgovor na temu

Ninobos
BS

Član broj: 44692
Poruke: 49
*.customer.m-online.net.



Profil

icon Re: sql upit12.05.2005. u 07:50 - pre 229 meseci
Da,funkciju sam odradio u paketu zbog REF CURSOR_a.
U pravu si,nisam dobro video sto se tice klauzule USING.Znaci funkcija bi trebala da radi kada izbacim USING.

Hvala na sugestijama
pozdrav
nn
 
Odgovor na temu

[es] :: Oracle :: sql upit

[ Pregleda: 6424 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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