it-swarm.com.de

WENN EXISTS-Bedingung nicht mit PLSQL funktioniert

Ich versuche, den TEXT zu drucken, wenn die Bedingung WAHR ist. Der Auswahlcode funktioniert einwandfrei. Es zeigt 403 Wert, wenn ich nur Auswahlcode ausführen. Aber ich muss Text drucken, wenn eine Bedingung vorliegt. Was ist das Problem mit dem folgenden Code.

BEGIN
IF EXISTS(
SELECT CE.S_REGNO FROM
COURSEOFFERING CO
JOIN CO_ENROLMENT CE
  ON CE.CO_ID = CO.CO_ID
WHERE CE.S_REGNO=403 AND CE.COE_COMPLETIONSTATUS = 'C' AND CO.C_ID = 803
)
THEN
    DBMS_OUTPUT.put_line('YES YOU CAN');
END;

Hier ist der Fehlerbericht:

Error report:
ORA-06550: line 5, column 1:
PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:

   ) , with group having intersect minus start union where
   connect
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
30
nirmalgyanwali

IF EXISTS() ist semantisch falsch. EXISTS Bedingung kann nur innerhalb einer SQL-Anweisung verwendet werden. Sie könnten also Ihren pl/sql-Block wie folgt umschreiben:

declare
  l_exst number(1);
begin
  select case 
           when exists(select ce.s_regno 
                         from courseoffering co
                         join co_enrolment ce
                           on ce.co_id = co.co_id
                        where ce.s_regno=403 
                          and ce.coe_completionstatus = 'C' 
                          and ce.c_id = 803
                          and rownum = 1
                        )
           then 1
           else 0
         end  into l_exst
  from dual;

  if l_exst = 1 
  then
    DBMS_OUTPUT.put_line('YES YOU CAN');
  else
    DBMS_OUTPUT.put_line('YOU CANNOT'); 
  end if;
end;

Oder Sie können einfach die Funktion count verwenden, um die Anzahl der von der Abfrage zurückgegebenen Zeilen zu bestimmen, und rownum=1 Prädikat - Sie müssen nur wissen, ob ein Datensatz vorhanden ist:

declare
  l_exst number;
begin
   select count(*) 
     into l_exst
     from courseoffering co
          join co_enrolment ce
            on ce.co_id = co.co_id
    where ce.s_regno=403 
      and ce.coe_completionstatus = 'C' 
      and ce.c_id = 803
      and rownum = 1;

  if l_exst = 0
  then
    DBMS_OUTPUT.put_line('YOU CANNOT');
  else
    DBMS_OUTPUT.put_line('YES YOU CAN');
  end if;
end;
50
Nick Krasnov

Leider hat PL/SQL kein IF EXISTS Operator wie SQL Server. Aber Sie können so etwas tun:

begin
  for x in ( select count(*) cnt
               from dual 
              where exists (
                select 1 from courseoffering co
                  join co_enrolment ce on ce.co_id = co.co_id
                 where ce.s_regno = 403 
                   and ce.coe_completionstatus = 'C' 
                   and co.c_id = 803 ) )
  loop
        if ( x.cnt = 1 ) 
        then
           dbms_output.put_line('exists');
        else 
           dbms_output.put_line('does not exist');
        end if;
  end loop;
end;
/
6
HiltoN