2

我在oracle中有sp。我的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”:未执行语句句柄

那么,我如何在 sqlplus 中执行我的 SP?谢谢

4

1 回答 1

3

从您从未OPEN CURSOR而是将SYS_REFCURSOR作为OUT参数的引用这一事实可以明显看出该错误。

ORA-24338: 语句句柄未执行

原因:在执行语句句柄之前尝试获取或描述。

行动:执行一个语句,然后获取或描述数据。

您需要使用OPEN cursor FOR...语句:

v_final :=v_select|| v_from|| v_where;

-- open the cursor
OPEN cv_1 FOR v_final;

附带说明一下,在SQL*Plus中编译 PL/SQL时,如果您看到错误,您应该始终使用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.

所以,现在您知道确切的行号错误消息,这将帮助您调试和修复错误。

于 2015-11-12T06:39:17.927 回答