oracle package里面procedure调用function的问题,在线等结果

woodheart 2009-04-09 09:20:58
包头
create or replace package pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2;
procedure p_test;
procedure p_main;
end pkg_test;
包体
create or replace package body pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2 is
v_sumareaname varchar2(100);
begin
begin
select t.area_name
into v_sumareaname
from t_area t
where t.area_type_id = in_area_type
and t.area_id = in_area_id;

exception
when others then
v_sumareaname := null;
end;

return v_sumareaname;
end f_getsumareaname;

procedure p_test is
begin
begin
execute immediate '
drop table T_OWEFEE';
exception
when others then
null;
end;

execute immediate '
create table t_owefee as
select f_getsumareaname(a.area_id,2) as xj,
f_getsumareaname(a.area_id,3) as zj,
f_getsumareaname(a.area_id,5) as pq,
f_getsumareaname(a.area_id,6) as sq,
a.owefee
from tmp_ffp_servacctarea a';
end p_test;

procedure p_main is
begin
p_test;
end;

begin
null;
end pkg_test;

编译通过后,执行的时候,就报错了。ORA-00904: "F_GETSUMAREANAME": invalid identifier
但是把调用函数的地方都改成加上包名pkg_test.f_getsumareaname后,
能执行了,但是中间不清楚是不是 有什么错误,不停的重新执行
中间我是把所有的异常都捕获的啊
请高手指点一下
...全文
993 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gun_he 2009-04-22
  • 打赏
  • 举报
回复
create table 要用动态sql写
v_sql := 'create table as xxxxxxx';

execute immediate(v_sql);
LJY_AINILU 2009-04-10
  • 打赏
  • 举报
回复
你看到我的回复没?
pinklotus 2009-04-09
  • 打赏
  • 举报
回复
不知道是不是对于自定义函数在包调用需要加一个关键字deterministic?
在包体函数创建时加上关健字deterministic试一下,如:
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2 deterministic is

superhsj 2009-04-09
  • 打赏
  • 举报
回复
帮lz编辑了一下,发现begin比end多一个
--包头 
create or replace package pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2;
procedure p_test;
procedure p_main;
end pkg_test;
--包体
create or replace package body pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2 is
v_sumareaname varchar2(100);
begin
begin
select t.area_name
into v_sumareaname
from t_area t
where t.area_type_id = in_area_type
and t.area_id = in_area_id;

exception
when others then
v_sumareaname := null;
end;
return v_sumareaname;
end f_getsumareaname;

procedure p_test is
begin
begin
execute immediate 'drop table T_OWEFEE';
exception
when others then
null;
end;
execute immediate 'create table t_owefee as select f_getsumareaname(a.area_id,2) as xj,f_getsumareaname(a.area_id,3) as zj,f_getsumareaname(a.area_id,5) as pq,f_getsumareaname(a.area_id,6) as sq,a.owefee from tmp_ffp_servacctarea a';
end p_test;

procedure p_main is
begin
p_test;
end;

begin
null;
end pkg_test;
LJY_AINILU 2009-04-09
  • 打赏
  • 举报
回复
楼主 刚才看了你的程序
你的select语句是用exec 执行的所以引用的函数是需要是需要加上包名的
然后 你的程序尾部有问题
procedure p_main is
begin
p_test;
end;

begin
null;
这里你自己改吧
LJY_AINILU 2009-04-09
  • 打赏
  • 举报
回复
正常的情况下是可以引用的
不用加包名
楼主 你把程序的格式弄的清楚一下再让大家看吧
看的晕乎的
fosjos 2009-04-09
  • 打赏
  • 举报
回复
楼主就不能加点缩进,看得好累啊
woodheart 2009-04-09
  • 打赏
  • 举报
回复
这个我查了资料,发现在sql语句中,是需要加上包名的,在:=赋值语句可以不用加。
但是中间出了异常,job会不停的重新执行,是什么原因引起的啊?
job没有失败次数。
oraclelogan 2009-04-09
  • 打赏
  • 举报
回复
plsql里面是这样的吧,比较严谨些,好久不用了,有点遗忘了!
woodheart 2009-04-09
  • 打赏
  • 举报
回复
多谢这位兄弟
我可能拷贝的时候少拷贝了一个
实际代码没问题的,否则编译肯定报错了嘛

[Quote=引用 6 楼 superhsj 的回复:]
帮lz编辑了一下,发现begin比end多一个

SQL code--包头
create or replace package pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2;
procedure p_test;
procedure p_main;
end pkg_test;
--包体
create or replace package body pkg_test is
function f_getsumareaname(in_area_id int, in_area_type int) return varchar2 is
v_suma…
[/Quote]

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧