Как выполнить 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.
Итак, теперь вы знаете точный номер строки и сообщение об ошибке, которое поможет вам отладить и исправить ошибку.