Oracle中包与函数的区别???

m540920181 2011-10-12 08:26:22
create or replace package mypace1
as
procedure myproc(depenos emp.deptno%type) ;
function myfun(empnos emp.empno%type) return emp.sal%type;
end;

create or replace package body mypace1
as
procedure myproc(depenos emp.deptno%type)
as
cursor mysor(myno emp.deptno%type) is select * from emp where deptno = myno;
begin
for i in mysor(depenos)
loop
dbms_output.put_line(i.sal||' ' ||i.deptno);
end loop;
end;
function myfun(empnos emp.empno%type) return emp.sal%type
as
mysal emp.sal%type;
begin
select sal into mysal from emp where empno=empnos ;
mysal:=mysal+500;
----------下面这行代码--------
update emp set sal=mysal;
return mysal ;
end;
end;


上述代码运行正确;

create function myfun(empnos emp.empno%type) return emp.sal%type
as
mysal emp.sal%type;
begin
select sal into mysal from emp where empno=empnos ;
mysal:=mysal+500;
update emp set sal=mysal where empno=empnos;
return mysal ;
end;

这个代码块也运行正确;

为什么把第一段代码中function 方法中 的修改语句中添加上条件语句是有问题;??????
...全文
310 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
m540920181 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 nvhaixx 的回复:]
引用 5 楼 m540920181 的回复:
引用 4 楼 nvhaixx 的回复:
你包头和包体中的语法不正确,end后面需要加上包体名或者存储过程名或者函数名。所以代码应该是
create or replace package mypace1
as
procedure myproc(depenos emp.deptno%type) ;
function myfun(empnos e……
[/Quote]
我没有出现这样的报错,我用的是 Oracle11G
nvhaixx 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 m540920181 的回复:]
引用 4 楼 nvhaixx 的回复:
你包头和包体中的语法不正确,end后面需要加上包体名或者存储过程名或者函数名。所以代码应该是
create or replace package mypace1
as
procedure myproc(depenos emp.deptno%type) ;
function myfun(empnos emp.empno%type) return em……
[/Quote]
顺便问一下 ,我在PL/SQL中如果end后不加具体的包名,存储过程名或函数名,是会报错的,楼主的不会吗?
xiaobn_cn 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 m540920181 的回复:]
如果我的书写不写select 查询语句直接写修改语句,程序可以运行成功,
这里面可以写修改程序,Oralce中可以有修改语句并且添加条件
[/Quote]
1. 与前面的select无关。
2. oracle的update是可以添加条件,但是不是按你写的
update sal=mysal from emp where empno=empnos;
而应当是
update emp set sal=mysal where empno=empnos;
m540920181 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaobn_cn 的回复:]
引用 16 楼 m540920181 的回复:
引用 15 楼 gjswxhb 的回复:
我是先查询:
select sal from emp where empno=empnos;
----然后赋值
mysal:=sal+500;
---------然后修改
update sal=mysal from emp where empno=empnos;
---就是说在包体中,如果上面……
[/Quote]

如果我的书写不写select 查询语句直接写修改语句,程序可以运行成功,
这里面可以写修改程序,Oralce中可以有修改语句并且添加条件
m540920181 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 xiaobn_cn 的回复:]
引用 19 楼 m540920181 的回复:
如果我的书写不写select 查询语句直接写修改语句,程序可以运行成功,
这里面可以写修改程序,Oralce中可以有修改语句并且添加条件

1. 与前面的select无关。
2. oracle的update是可以添加条件,但是不是按你写的
update sal=mysal from emp where empno=empnos;
而应当……
[/Quote]
哦,上面写错了,即使写正确包体中也报错,看第一次上传的数据,写的是正确的
xiaobn_cn 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 m540920181 的回复:]
引用 15 楼 gjswxhb 的回复:
我是先查询:
select sal from emp where empno=empnos;
----然后赋值
mysal:=sal+500;
---------然后修改
update sal=mysal from emp where empno=empnos;
---就是说在包体中,如果上面的一行代码中不写条件where 时,运行成功,一些条件是就报错了????[/Quote]
楼主你的错误很简单,oracle不支持update from语法,这个语法是sql server的。你的错误不在于写了where,而是在于写了from。
m540920181 2011-10-17
  • 打赏
  • 举报
回复
今天,我在写一遍,最后公布,谢谢大家了啊...
m540920181 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gjswxhb 的回复:]
上面的有点错误,纠正:

begin
update emp
set sal=mysal
where empno = empnos;--应该没错啊!
exception when others then
DBMS_OUTPUT.PUT_LINE('Error Code = ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error M……
[/Quote]

我是先查询:
select sal from emp where empno=empnos;
----然后赋值
mysal:=sal+500;
---------然后修改
update sal=mysal from emp where empno=empnos;
---就是说在包体中,如果上面的一行代码中不写条件where 时,运行成功,一些条件是就报错了????
物润声无 2011-10-16
  • 打赏
  • 举报
回复
上面的有点错误,纠正:

begin
update emp
set sal=mysal
where empno = empnos;--应该没错啊!
exception when others then
DBMS_OUTPUT.PUT_LINE('Error Code = ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message = ' || SQLERRM);
end;
物润声无 2011-10-16
  • 打赏
  • 举报
回复
update中带where 条件在11g也行吧,

不妨打印出err log 看看:期待着楼主将问题解决,并贴出方案。

function myfun(empnos emp.empno%type) return emp.sal%type
as
mysal emp.sal%type;
begin
begin
select sal into mysal from emp where empno=empnos ;
mysal:=mysal+500;
exception when others then
DBMS_OUTPUT.PUT_LINE('Error Code = ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message = ' || SQLERRM);
end;
----------下面这行代码--------
begin
update emp set sal=mysal where empno=empnos;--应该没错啊!
exception no_data_found then
DBMS_OUTPUT.PUT_LINE('Error Code = ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message = ' || SQLERRM);
end;


return mysal ;
end;
jwd001 2011-10-15
  • 打赏
  • 举报
回复
运行报错与where没关系, 需在update后加commit, as 后加PRAGMA AUTONOMOUS_TRANSACTION.
jwd001 2011-10-15
  • 打赏
  • 举报
回复
在包体update中可以带where条件呀,没问题的.我的是oracle10 R2
m540920181 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jwd001 的回复:]
运行报错与where没关系, 需在update后加commit, as 后加PRAGMA AUTONOMOUS_TRANSACTION.
[/Quote]

不是,我想说的是:在包体中,update emp set 需要修改的内容 where 条件;
为什么放在包体中有问题,而 update emp set 需要修改的内容 放在包体中没问题
m540920181 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 opps_zhou 的回复:]
procedure myproc(depenos emp.deptno%type)

你定义的是存储过程,存储过程不能加 return

你下面定义的是 function 必须有 return
[/Quote]
怎么现在纠结的问题都不沾边啊,我说了,这个包是正确的,这个包体也是正确的,唯一的问题是,在方法中
修改数据中,为什么添加一个条件是,就报错,不添加,就没有错
m540920181 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jwd001 的回复:]
在包体update中可以带where条件呀,没问题的.我的是oracle10 R2
[/Quote]

我的是oracle11 的,不会是版本问题吧
m540920181 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nvhaixx 的回复:]
你包头和包体中的语法不正确,end后面需要加上包体名或者存储过程名或者函数名。所以代码应该是
create or replace package mypace1
as
procedure myproc(depenos emp.deptno%type) ;
function myfun(empnos emp.empno%type) return emp.sal%type;
en……
[/Quote]

我说的是,这段代码是正确的,为什么在这段代码中,修改数据中,添加条件时,有错误
opps_zhou 2011-10-14
  • 打赏
  • 举报
回复
procedure myproc(depenos emp.deptno%type)

你定义的是存储过程,存储过程不能加 return

你下面定义的是 function 必须有 return
m540920181 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 minitoy 的回复:]
倒,看了半天不知道你要干什么.
[/Quote]

我晕,我的问题,写的一清二楚,你们怎么都把,问题想哪里去了

看最上面的,源代码,我写的一清二楚的,有不知道的再说:
minitoy 2011-10-14
  • 打赏
  • 举报
回复
倒,看了半天不知道你要干什么.
nvhaixx 2011-10-13
  • 打赏
  • 举报
回复
你包头和包体中的语法不正确,end后面需要加上包体名或者存储过程名或者函数名。所以代码应该是
create or replace package mypace1
as
procedure myproc(depenos emp.deptno%type) ;
function myfun(empnos emp.empno%type) return emp.sal%type;
end mypace1 ;

create or replace package body mypace1
as
procedure myproc(depenos emp.deptno%type)
as
cursor mysor(myno emp.deptno%type) is select * from emp where deptno = myno;
begin
for i in mysor(depenos)
loop
dbms_output.put_line(i.sal||' ' ||i.deptno);
end loop;
end myproc;
function myfun(empnos emp.empno%type) return emp.sal%type
as
mysal emp.sal%type;
begin
select sal into mysal from emp where empno=empnos ;
mysal:=mysal+500;
----------下面这行代码--------
update emp set sal=mysal;
return mysal ;
end myfun;
end mypace1;

加载更多回复(3)

17,140

社区成员

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

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