10. november 2003 - 13:47Der er
6 kommentarer og 1 løsning
Exists i PL/SQL
Hejsa
Findes der en funktion i PL/SQL i stil med den EXISTS der findes i TransactSQL?
I TSQL kan man fx. skrive:
if exists(select * from some_table) begin ... end
Jeg har ikke kunnet finde tilsvarende funktionalitet i PL/SQL. Jeg har så (helt selv :-) ) fundet ud af at lave :
declare v_Exist integer; begin select count(*) into v_exist from some_table; if v_Exist>0 then ... end if; end;
Dette har dog den ulempe, at Oracle rent faktisk skal til at tælle alle records i tabellen der overholder min WHERE (i dette tilfælde ingen), og det kan på en meget stor tabel godt tage noget tid. Og alt hvad jeg i virkeligheden ville, var at vide om der var bare 1.
Jeg har så fundet ud af, at hvis jeg udvider min select til:
declare v_Exist integer; begin select count(*) into v_exist from some_table where rownum=1; if v_Exist>0 then ... end if; end;
Så ser det faktisk ud til, at SQL'en terminerer når den har fundet første row der overholder min where, og jeg skal ikke lave en kæmpe count på hele tabellen. Meeeen det ville nu se pænere ud med TSQL's EXISTS syntaks...
Er der nogen der kender til noget tilsvarende (eller smartere end det jeg gør)?
Hmm, jeg syntes nu det ser lidt ud til, at din løsning minder meget om den jeg selv skrev med RowNum=1. Jeg skal stadig erklære en variabel til at select'e ind i , og jeg skal stadig udføre en sql uden for min if-sætning. I TSQL kan jeg lave mere strømlinet kode, så som :
begin if exists(select * from sometable) and not exists(select * from sometable2) and @Key!=1 begin ... end end
i Oracle vil tilsvarende i så fald blive noget mere ulæselig:
declare vExist1 integer; vExist2 integer; begin select count(*) into vExist1 from dual where exists (select * from sometable); select count(*) into vExist2 from dual where exists (select * from sometable2); if vExist1=1 and vExist2=1 and pKey!=1 then ... end if; end;
Problemet er muligvis, at man ikke kan udføre sql inde i en if i PL/SQL. Det kan man godt i TSQL. Så følgende vil fungere i TSQL, men ikke i Oracle:
if (select count(*) from sometable)>0 then/begin
Derfor slipper man for den (unødvendige) variabel, og den seperate select i TSQL.
Hvis ikke der kommer andre forslag, skal ud nok få pointene PSV.
Du kan IKKE lave "if (select ...) then" i Oracle :-)
Hvis du synes det kode du selv må skrive i Oracle er grimt - så skulle du se det som Oracle Migration WorkBench laver :-) (OMWB "Automatisk" migrering fra eks. MSSQL til Oracle).
OMWB er glimrende hvis du - som vi skulle - skulle flytte 1200+ stpored procedures. Du slipper for en del slavearbejde... :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.