ORA-0675:包或函数ORG_SPGETTYPE处于无效状态

时间:2013-09-05 06:32:40

标签: oracle plsql eclipse-plugin oracle10g

PROCEDURE ORG_spGetType
(
  v_TypeId IN NUMBER DEFAULT NULL 

)
AS

BEGIN


      SELECT * 
        FROM ORG_Type 
        WHERE  TypeId =  v_TypeId ;
END;

在oracle10g以上运行时,运行eclipse平台sql编辑器时出现错误,如“ORA-0675:包或函数ORG_SPGETTYPE处于无效状态”

2 个答案:

答案 0 :(得分:2)

这并不奇怪;该程序无效。在编译过程或任何其他PL / SQL块时,应检查它是否已正确编译。

如果您正在编译命令行,即在SQL * Plus中,您可以使用SHOW命令并使用ERRORS变量,其中:

  

显示错误的行号和列号(LINE / COL)以及错误本身(错误)。

编译完程序后,输入以下内容:

show errors

或者,您可以使用USER_ERRORS系统视图,该视图将显示您所在的架构可以看到的所有错误的列表。

select *
  from user_errors
 where name = 'ORG_SPGETTYPE'

您的错误的实际原因是您不能简单地在PL / SQL中进行SELECT。如果你这样做,你不能让PL / SQL以任何方式使用SELECT语句的结果,因此它不允许你这样做。如果您正在选择需要的东西来做某事;那件事取决于你。

有很多方法可以做到这一点,但是假设ORG_TYPE表在TYPEID列上是唯一的,并且您希望将一列作为OUT参数返回。您的程序将如下所示:

create or replace procedure org_spgettype ( 
      P_typeid in org_type.type_id%type
    , P_some_column out org_type.some_column%type
      ) is

begin

   select some_column into P_some_column     
     from org_type 
    where typeid = P_typeid;

end;
/
show errors

请注意以下几点:

  1. 如果这是您的主键,似乎不需要DEFAULT NULL;它不能为NULL,所以你不想允许这种可能性。
  2. 我已将您的参数声明为列的类型;这使您无需重新编码所有内容即可更改列。
  3. 关于所有这些(开始的例外)还有很多东西要解释,所以我强烈建议先学习一些基础教程,或者向同事/朋友寻求帮助。

答案 1 :(得分:2)

创建过程时,您将收到“已编译并带有警告”消息。您可以查询user_errors视图,了解针对您的工作报告的问题。你会看到类似'PLS-00428:在这个SELECT语句中需要一个INTO子句',因为你没有选择什么。

documentation显示了如何做到这一点。您需要声明要选择的变量。在这种情况下,您可以声明rowtype变量:

CREATE OR REPLACE PROCEDURE ORG_spGetType (v_TypeId IN NUMBER DEFAULT NULL) AS
  l_org_type org_type%rowtype;
BEGIN
  SELECT * 
    INTO l_org_type
    FROM ORG_Type 
    WHERE  TypeId =  v_TypeId ;

    -- do something with l_org_type
END;
/

请注意,如果没有匹配的行,则可能会出现no_data_found异常,如果传递的ID有多个匹配,则可能会出现too_many_rows

但目前尚不清楚您计划对检索到的数据做些什么。这当然对它没有任何作用,它只是被选中然后被遗忘。该过程的名称建议您要将表中的全部或部分数据返回给调用者。如果它只是一个字段值,那么这应该是一个函数而不是一个过程。或者您可以添加out参数以将值放入(如Ben所示),或返回refcursor。取决于你需要的东西。

default null,但是,可能建议您有时会期望多个结果,如果没有传递值,可能是整个表 - 尽管您的where子句不会如果v_typeid为空,则找到任何内容。