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处于无效状态”
答案 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 :(得分: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
为空,则找到任何内容。