0
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 处于无效状态”的错误

4

2 回答 2

2

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

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

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

编译过程后,键入以下内容:

show errors

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

select *
  from user_errors
 where name = 'ORG_SPGETTYPE'

您的错误的实际原因是您不能简单地在 PL/SQL 中选择。如果你这样做,你就没有让 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. 我已将您的参数声明为列的类型;这使您可以更改列而无需重新编码所有内容。

关于这一切还有很多要解释的(一开始除外),所以我强烈建议先学习一些基本教程或向同事/朋友寻求帮助。

于 2013-09-05T07:39:04.800 回答
2

创建过程时,您将收到“已编译并带有警告”消息。您可以查询user_errors视图以查看针对您的操作报告了哪些问题。您将看到类似“PLS-00428:此 SELECT 语句中应有 INTO 子句”之类的内容,因为您没有选择某些内容。

文档显示了如何做到这一点。您需要声明要选择的变量。在这种情况下,您可以声明一个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如果没有匹配的行,或者too_many_rows传递的 ID 有多个匹配项,这可能会引发异常。

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

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

于 2013-09-05T07:39:39.523 回答