2015-11-12 2 views
2

У меня есть sp в oracle. Мой SP показан нижеКак выполнить PL/SQL Oracle в sqlplus?

create or replace 

PROCEDURE GETMONITORING 
(
v_namabarang in varchar2 default null, 
v_JenisLayanan in varchar2 default null, 
cv_1 IN OUT SYS_REFCURSOR 
) 
AS 
    v_where VARCHAR2(200); 
    v_Select VARCHAR2(200); 
    v_from VARCHAR2(200); 
    v_final VARCHAR2(200); 
    v_result VARCHAR2(200); 
BEGIN 
    v_Select:='select * '; 
    v_from :='from permohonan '; 
    v_where :='where sysdate=sysdate '; 

IF nvl(length(v_namabarang),0) <> 0 then 
     v_Where := v_Where || ' AND namabarang like ''' || v_namabarang|| '%'' '; 
    end if; 

IF nvl(length(v_jenislayanan),0) <> 0 then 
     v_Where := v_Where || ' AND jenislayanan like ''' || v_jenislayanan || '%'' '; 
    end if; 

    v_final :=v_select|| v_from|| v_where; 

dbms_output.put_line(v_result); 

END; 

Я попытался EXEC в SQLPLUS по

SQL> var r refcursor; 

SQL> exec getmonitoring('AC','1',:r); 

SQL>print :r; 

и результат "ORA-24338": Заявление ручки не выполняется

Итак, как я EXEC мой SP в sqlplus? Благодаря

ответ

3

ошибка очевидна из того, что вы никогда не ОТКРЫТОГОCURSOR но делает ссылку на SYS_REFCURSOR как OUT параметра.

ORA-24338: дескриптор инструкции не выполняется

Причина: выборка или описать была предпринята попытка перед выполнением операторный дескриптор.

Действие: Выполните инструкцию , а затем извлеките или опишите данные.

Вы должны использовать ОТКРЫТЫЙ курсор FOR ... заявление:

v_final :=v_select|| v_from|| v_where; 

-- open the cursor 
OPEN cv_1 FOR v_final; 

На стороне записки, в то время как компиляции PL/SQL в SQL * Plus, если вы видите ошибки , вы должны всегда использовать SHOW ERRORS, чтобы увидеть полный стек ошибок.

Например,

SQL> create or replace procedure p 
    2 as 
    3 begin 
    4 null 
    5 end; 
    6/

Warning: Procedure created with compilation errors. 

SQL> show errors 
Errors for PROCEDURE P: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/1  PLS-00103: Encountered the symbol "END" when expecting one of the 
     following: 
     ; 
     The symbol ";" was substituted for "END" to continue. 

Итак, теперь вы знаете точное номер строки и сообщение о ошибке, который поможет вам отладить и исправить ошибку.

+0

У меня есть вход «OPEN cv_1 FOR v_final;» и удалите « dbms_output.put_line (v_result);» . Но когда я выполняю мой SP по-прежнему ошибку ORA-0094. спасибо –

+0

Сделайте, как я показал, см. обновленный ответ. Используйте «SHOW ERRORS» и отредактируйте свой вопрос, чтобы показать, что вы на самом деле делаете. –

+0

решена. Я был неправильным вводом «OPEN cv_1 FOR v_final;». Спасибо –

Смежные вопросы