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 处于无效状态”的错误
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 处于无效状态”的错误
这不足为奇。该程序无效。在编译过程或任何其他 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
请注意以下几点:
关于这一切还有很多要解释的(一开始除外),所以我强烈建议先学习一些基本教程或向同事/朋友寻求帮助。
创建过程时,您将收到“已编译并带有警告”消息。您可以查询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