Avatar billede dmk Nybegynder
10. november 2003 - 13:47 Der 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)?


/DMK
Avatar billede psv Nybegynder
10. november 2003 - 14:09 #1
v_exists := 0;
select 1 into v_exists
from Dual
where exists (select * from some_table);
if v_exists = 1 then


end if;
Avatar billede peter_r Nybegynder
10. november 2003 - 19:29 #2
PSV har ret.

Husk at hvis du i PL/SQL skal bruge noget vedrørende DML og DDL statements, så kik i dokumentation til SQL
Avatar billede dmk Nybegynder
11. november 2003 - 09:53 #3
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.

/DMK
Avatar billede psv Nybegynder
11. november 2003 - 10:01 #4
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).
Avatar billede peter_r Nybegynder
11. november 2003 - 11:21 #5
Du må godt kombinere subquerys i Oracle, så du får:

v_exists := 0;
select 1 into v_exists
from Dual
where exists (select 1 from sometable)
and not exists (select 1 from sometable2);

if v_exists = 1 and pKey!=1 then


end if;
Avatar billede dmk Nybegynder
11. november 2003 - 13:41 #6
Øv bøv så må jeg lave den omstændige løsning, hvor jeg laver selects FØR jeg laver min IF. men det må jeg jo så gøre.

Jeg tror jeg springer over det med OMWB. Jeg har ikke gode erfaringer med at læse (og forstå) genereret kode :-)
Avatar billede psv Nybegynder
11. november 2003 - 13:45 #7
OMWB er glimrende hvis du - som vi skulle - skulle flytte 1200+ stpored procedures. Du slipper for en del slavearbejde... :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester