Как выполнить PL/SQL Oracle в sqlplus?

Я говорил в оракуле. Мой SP показан ниже

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;

Я пытался выполнить в sqlplus

SQL> var r refcursor;

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

SQL>print :r;

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

Итак, как я исполняю свой SP в sqlplus? Спасибо

1 ответ

Решение

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

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

Причина. Была предпринята попытка извлечения или описания перед выполнением дескриптора оператора.

Действие: выполнить оператор, а затем получить или описать данные.

Вам нужно использовать оператор OPEN курсор 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.

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

Другие вопросы по тегам