IF EXISTS condition not working with PLSQL

匿名 (未验证) 提交于 2019-12-03 02:23:02

问题:

I am trying to print the TEXT when condition is TRUE. The select code is perfectly working fine. It's showing 403 value when i only run select code. But I have to print some text when condition exists. What's the problem with following 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;

Here is the error report:

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:

回答1:

IF EXISTS() is semantically incorrect. EXISTS condition can be used only inside a SQL statement. So you might rewrite your pl/sql block as follows:

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;

Or you can simply use count function do determine the number of rows returned by the query, and rownum=1 predicate - you only need to know if a record exists:

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;


回答2:

Unfortunately PL/SQL doesn't have IF EXISTS operator like SQL Server. But you can do something like this:

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; /


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!