【问题标题】:How to execute PL/SQL Oracle in sqlplus?如何在 sqlplus 中执行 PL/SQL Oracle?
【发布时间】:2015-11-12 14:58:37
【问题描述】:

我在 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?谢谢

【问题讨论】:

    标签: oracle plsql execute ora-24338


    【解决方案1】:

    错误很明显,因为您从未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.
    

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

    【讨论】:

    • 我输入了“OPEN cv_1 FOR v_final;”并删除“dbms_output.put_line(v_result);” .但是当我执行我的 SP 时仍然报错 ORA-0094。谢谢
    • 按照我的说明进行操作,请参阅更新后的答案。使用SHOW ERRORS 并编辑您的问题以显示您实际在做什么。
    • 已解决。我输入错误“OPEN cv_1 FOR v_final;”。谢谢
    • @AufalAhdy 好。请将其标记为已回答,其他人也会这样做!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多