2012-11-04 23 views
20

Tôi đang cố gắng in TEXT khi điều kiện là TRUE. Mã chọn là hoàn toàn làm việc tốt. Nó hiển thị giá trị 403 khi tôi chỉ chạy mã chọn. Nhưng tôi phải in một số văn bản khi điều kiện tồn tại. Vấn đề với mã sau là gì.Nếu điều kiện EXISTS không hoạt động với PLSQL

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; 

Dưới đây là báo cáo lỗi:

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: 

Trả lời

38

IF EXISTS() là ngữ nghĩa không chính xác. Điều kiện EXISTS chỉ có thể được sử dụng bên trong câu lệnh SQL. Vì vậy, bạn có thể viết lại pl/block sql của bạn như sau:

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; 

Hoặc bạn chỉ có thể sử dụng count chức năng làm xác định số lượng hàng trả lại do các truy vấn, và rownum=1 ngữ - bạn chỉ cần phải biết nếu một bản ghi tồn tại :

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; 
+0

Cảm ơn bạn vì mã tuyệt vời của bạn. Nó hoàn toàn phù hợp với tôi. – nirmalgyanwali

+0

"chỉ cần sử dụng chức năng đếm" là ít hiệu quả hơn nhiều. Stick với tồn tại/không tồn tại. – miraclefoxx

+0

Tại sao 'exist' không thể được sử dụng trong các câu lệnh chèn? – zygimantus

5

Rất tiếc PL/SQL không có nhà điều hành IF EXISTS như SQL Server. Nhưng bạn có thể làm điều gì đó như thế này:

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

Cảm ơn bạn đã giúp Hilton. Ya, tôi có ý tưởng từ mã của bạn. Nhưng tôi không biết tại sao điều kiện là FALSE và nó cho thấy tình trạng ELSE. Giá trị trong x.cnt là 0. – nirmalgyanwali

+0

Có lẽ điều này là do tôi đã giảm truy vấn của bạn với hằng số 'C', điều đó phải ở dạng chữ hoa. – HiltoN

Các vấn đề liên quan