【问题标题】:Calling a Stored Procedure in Oracle在 Oracle 中调用存储过程
【发布时间】:2010-12-16 11:44:07
【问题描述】:

这应该是相当简单直接的事情,但由于某种原因,我无法让它工作。我已经像这样创建了我的 SProc:

create or replace procedure zadmit_migrate_data (zadmit_seq_no number)
is
    thisPIDM number;
begin
    select pidm into thisPIDM
    from saturn.zadmit_core_data
    where pk_seqno = zadmit_seq_no;

    if thisPIDM is not null then
        dbms_output.put_line('thisPIDM is NOT null!');    
    else
        dbms_output.put_line('thisPIDM is null!');
    end if;
end zadmit_migrate_data;

现在我试着这样称呼它:

call zadmit_migrate_data(4);

然后我得到这个错误:

ORA-06575 Package or function is in an invalid state.

所以我尝试了这个:

execute zadmit_core_data(4);

反而得到这个错误:

ORA-00900 Invalid SQL statement.

指出我哪里做对了可能会花费更少的时间,但是如果有人能告诉我哪里做错了,那可能会更有用。 :)

【问题讨论】:

  • 如果我错了,请纠正我 - 在这种情况下,else 分支永远不会被击中,对吗?如果 select 语句不返回任何内容,则会引发 NO_DATA_FOUND 异常,因此我看不出拥有 else 条件的意义。
  • @Sathya - 你错了。没有任何迹象表明 PIDM 是强制性的,因此很有可能找到一条记录但在该列中有一个 NULL。

标签: sql oracle stored-procedures ora-00900


【解决方案1】:

运行这个

SQL>  alter procedure zadmit_migrate_data compile;
SQL>  show errors

鉴于您的过程很简单,诊断产生的错误堆栈应该不难。

【讨论】:

  • 谢谢。鉴于显示的答案,这是找出正在发生的事情的最简单方法。原来我的 SProc 没有识别表,所以我移动到与表相同的架构中,一切都很好。
【解决方案2】:

您的执行语句不应该是“execute zadmit_migrate_data(4);”吗? ?

无论如何,运行这个命令:

SELECT object_name FROM user_objects WHERE status='INVALID';

会告诉你程序是否有效。

执行您的 CREATE 或 REPLACE ... 命令,然后立即执行命令

SHOW ERRORS

应该告诉你遇到了什么编译错误。

【讨论】:

  • 如果您使用像 Oracle 的 SQL Developer 这样的工具来编写包,您可以获得关于 PL/SQL 编译问题的更直接的反馈。也就是说,如果您在没有花哨的工具的情况下陷入困境,那么知道如何使用 SQLPLUS 和纯文本编辑器完成所有操作将是一个真正的好处。
【解决方案3】:

如果你用谷歌搜索错误ORA-06575,你会发现:

您试图执行一条 SQL 语句 引用了一个 PLSQL 函数 处于无效状态。有时候是这样的 当函数被编译时 错误。

您可以通过以下方式解决此问题:

纠正错误然后重新编译 功能。然后重新执行SQL 声明。

一旦你的程序编译完成,你可以像这样执行它:

begin 
    zadmit_migrate_data(4);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2017-04-13
    • 2021-11-02
    相关资源
    最近更新 更多