十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
你的这个想法(在包体的函数/过程里面使用包体定义的游标记录类型作为参数)是不能实现的.
成都创新互联自2013年起,先为宝兴等服务建站,宝兴等地企业,进行企业商务咨询服务。为宝兴企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
可以把函数F_do_sth_with_C中需要的参数在包头进行定义. 如果这个参数的类型是由包体的函数/过程动态决定的, 那么你要另想一些变通的办法.
emp表是oracle安装包里的example,它属于scott,确认一下这个表是否存在:
select owner,object_type from dba_objects where object_name='EMP';
如果这个表存在,出现这个错误,有以下几个原因:
1.这个包的所有者没有对emp表的select权限
2.虽然有权限,但在引用它的时候必需明确这个表的schema,也就是上面那个查询的owner,你应该用scott.emp
先create package,在里面声明procedure
然后再create package body,在package body里面编写procedure的代码即可(相当于create procedure)。
包里没有create procedure
示例如下:
CREATE OR REPLACE PACKAGE pkg_test IS
PROCEDURE pro_test(V_OLD IN VARCHAR2,V_NEW IN VARCHAR2);
...
END test;
/
CREATE OR REPLACE PACKAGE BODY pkg_test IS
...
PROCEDURE pro_test(V_OLD IN VARCHAR2,V_NEW IN VARCHAR2) IS
BEGIN
...
END;
...
END pkg_test;
先修改包头,加入存储过程声明,然后再在包体中增加即可!
select text from dba_source where owner='xxx' and name='包名' and type='PACKAGE BODY'
order by line asc
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成
1.创建包
--创建一个包sp_package
create package sp_package is
--声明该包有一个过程和函数,(没有实现)
procedure update_sal(name varchar2,newsal number);
function annual_nicome(name varchar2) return number;
end;
--创建包体(用于实现已经声明的函数和过程)
create package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
BEGIN
UPDATE emp
SET sal = newsal
WHERE ename = name;
END;
function annual_income(name varchar2)
return number is
annual_salary number;
BEGIN
SELECT sal * 12 + Nvl(comm,0)
INTO annual_salary
FROM emp
WHERE ename = name;
RETURN annual_salary;
END;
end;
--调用包中的内容
exec sp_package.update_sal('name',number);