我已经在Oracle SQL Developer中编写了简单的存储过程,但是发现附加,执行/运行步骤出错。
这是我的代码:
CREATE OR REPLACE PROCEDURE EMP_NAME (EMP_ID_IN IN VARCHAR2,
EMP_NAME_OUT OUT VARCHAR2)
AS
BEGIN
SELECT first_name
INTO EMP_NAME_OUT
FROM employee
WHERE emp_id = EMP_ID_IN;
END EMP_NAME;
它也显示此错误
答案 0 :(得分:1)
该过程本身似乎还可以。但是,它的执行有些奇怪。
我建议您从工作表本身运行它,例如
declare
l_out employee.first_name%type;
begin
emp_name(100, l_out);
dbms_output.put_line('Result = ' || l_out);
end;
/
但是,为什么它是一个程序? 功能不是更好的选择吗?例如。
create or replace function emp_name (emp_id_in in varchar2)
return employee.first_name%type
is
retval employee.first_name%type;
begin
select first_name
into retval
from employee
where emp_id = emp_id_in;
return retval;
end;
/
您将以一种简单的方式运行它,如
select emp_name(100) from dual;
答案 1 :(得分:1)
您的数据字典出了点问题。 edit:您使用的是DB 10g,我猜object_id不在所有参数视图中。当我们执行存储过程时,我们会向数据库询问有关代码的一些信息。
SELECT data_type, argument_name name
FROM all_arguments a, all_objects o
WHERE a.object_id=o.object_id
AND o.object_name=? and o.owner=? and a.package_name is NULL
order by position
关于无效的object_id的错误-来自此查询。您正在运行什么版本的Oracle数据库?您可以在ALL_OBJECTS中看到您的PL / SQL对象,并且您的参数显示在ALL_ARGUMENTS中吗?
我已将您的代码修改为HR.EMPLOYEES表。
它按预期工作。
我们运行一些代码以向您显示两个参数。
我为员工编号或ID输入了'101'的值,然后单击OK。
然后OUT参数显示在下面的“日志”面板中。
如果打开日志面板(查看->日志),也会看到“声明”页面。在这里,您可以看到我们在数据库上执行的所有代码。那就是我去OBJECT_ID上获取失败的SQL的地方。去看一下,然后遍历代码并确认什么不起作用。
要解决此问题,请查找支持10g(例如2.1)的SQLDev的旧副本,或将数据库至少升级到11.2.0.4。