2013-11-07 6 views
-2

Я пытаюсь скомпилировать хранимую процедуру:IF еще условие в SQL хранимой процедуры

create 
procedure checkFroud2(code IN varchar2, p_recordset OUT SYS_REFCURSOR) 
AS 
BEGIN 
OPEN p_recordset FOR 

if code='C' then 
select * from emp 
//dbms_output.putline('this is if block') 
else if code='F' then 
dbms_output.putline('this is else block') 
else 
dbms_output.putline('last else') 
end if; 
end checkFroud2; 

, но это показывает ошибку компиляции времени. Кто-нибудь может предложить, где проблема?

+0

Почему Вы голосуете вниз? есть ли у вас какие-либо проблемы с вопросом или ответом? –

ответ

0
CREATE 
PROCEDURE checkFroud2(
      code IN VARCHAR2, 
      p_recordset OUT SYS_REFCURSOR) 
AS 
BEGIN 
    IF code='C' THEN 
    dbms_output.put_line('this is if block'); 
    OPEN p_recordset FOR   
    SELECT * FROM emp; 
    ELSIF code='F' THEN 

    --you can open p_recordset with dummy as 
    /*open p_recordset for select * from dual where 1 = 0; */ 
      dbms_output.put_line('this is else block'); 

    ELSE 
    /*open p_recordset for select * from dual where 1 = 0; */ 
      dbms_output.put_line('last else'); 
    END IF; 
END checkFroud2; 
/

var o refcursor; 
BEGIN 
CHECKfroud2 
('C',:o); 

END; 
/

PRINT O; 
2

ELSE IF не использовался ELSIF, также удалять // перед dbms_output.putline('this is if block').

0

Использовать ELSIF вместо ELSE IF. Используя ELSE IF, вы открываете новый вложенный IF-блок, который вы не закрываете.

0

Пара ошибок: 1. Открыт набор записей для ??? Для чего?? 2. ELSIF и нет ELSE IF 3. где есть;

CREATE PROCEDURE CHECKFROUD2 (CODE  IN VARCHAR2, 
         P_RECORDSET   OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN P_RECORDSET FOR SELECT * FROM DUAL; 

    IF CODE = 'C' 
    THEN 
     SELECT * FROM EMP; 
    ELSIF CODE = 'F' 
    THEN 
     DBMS_OUTPUT.PUTLINE ('this is else block'); 
    ELSE 
     DBMS_OUTPUT.PUTLINE ('last else'); 
    END IF; 
END CHECKFROUD2; 
3
The correct code is as follows: 

create procedure checkFroud2(code IN varchar2, p_recordset OUT SYS_REFCURSOR) 
AS 
BEGIN 
OPEN p_recordset FOR 

if code='C' then 
select * from emp 
//dbms_output.putline('this is if block'); 
elsif code='F' then 
dbms_output.putline('this is else block'); 
else 
dbms_output.putline('last else'); 
end if; 
end checkFroud2; 
+0

Очень хорошая попытка, –

+0

первый запуск в вашей системе. Работает? –

1

Это пример, в Oracle 11g

CREATE OR REPLACE PROCEDURE PROC_EMP_CHECK 
(
    EMPNO1 IN NUMBER 
, EMPNO2 IN NUMBER 
) 
AS 
EMPONE_NOT_EXISTS EXCEPTION; 
EMPTWO_NOT_EXISTS EXCEPTION; 
BOTHEMP_NOT_EXISTS EXCEPTION; 
EMPCOUNT1 NUMBER; 
EMPCOUNT2 NUMBER; 
BEGIN 

    SELECT COUNT(1) INTO EMPCOUNT1 FROM EMPLOYEES WHERE EMPLOYEE_ID=EMPNO1; 
    SELECT COUNT(1) INTO EMPCOUNT2 FROM EMPLOYEES WHERE EMPLOYEE_ID=EMPNO2; 
    BEGIN 
    IF(EMPCOUNT1=0 AND EMPCOUNT2=0)THEN 
    RAISE BOTHEMP_NOT_EXISTS; 
    ELSIF (EMPCOUNT1=0) THEN 
    RAISE EMPONE_NOT_EXISTS; 
    ELSIF (EMPCOUNT2=0) THEN 
    RAISE BOTHEMP_NOT_EXISTS; 
    dbms_output.put_line('ELSE BLOCK'); 
    END IF; 
    END; 

    EXCEPTION 
    WHEN EMPONE_NOT_EXISTS THEN 
    dbms_output.put_line('EMP One not exit'); 
    WHEN EMPTWO_NOT_EXISTS THEN 
    dbms_output.put_line('EMP two not exit'); 
    WHEN BOTHEMP_NOT_EXISTS THEN 
    dbms_output.put_line('both not exit'); 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLERRM); 
END PROC_EMP_CHECK; 
Смежные вопросы