写一段pl/sql程序代码,当向表中插入数据时,先查询是否存在相同主键,如果不存在则插入,存在则提醒。

createorreplacefunctioncharge_s(xinnumber)returnnumberass_warnnumber;beginselectcount... create or replace function charge_s(x in number)
return number as
s_warn number;

begin
select count(*) into s_warn from s where sno=x;
if nvl(s_warn,0)=0 then
insert into s(sno) values (x);
dbms_output.put_line('可以插入数据。');
return 0;

else
dbms_output.put_line('存在相同sno,不可以插入。');
return s_warn;
end if;

exception
when others then
dbms_output.put_line(sqlerrm || sqlcode);
end;
我写的这个就那句插入语句不能执行而报错。
展开
 我来答
fengfeidw
2011-11-23 · TA获得超过201个赞
知道答主
回答量:101
采纳率:0%
帮助的人:71.6万
展开全部
首先创建这个函数应该是没问题的吧
但是由于这个函数中包含了DML语句在使用过程中会存在很多问题
首先最好的建议是使用触发器
另外如果要想在函数中使用DML语句的话,建议增加pragma autonomous_transaction;和commit;那么你的函数建议修改为如下(表名和列名修改对照修改过来):

create or replace function fun_charge_s(x in number) return number as
pragma autonomous_transaction; ----
s_warn number;

begin
select count(*) into s_warn from test2 where year = x;
if nvl(s_warn, 0) = 0 then
insert into test2 (year) values (x);
commit; ----
dbms_output.put_line('可以插入数据。');
return 0;

else
dbms_output.put_line('存在相同sno,不可以插入。');
return s_warn;
end if;

exception
when others then
dbms_output.put_line(sqlerrm || sqlcode);
end;
爱栀竹的人
2011-11-23 · TA获得超过1352个赞
知道大有可为答主
回答量:1743
采纳率:0%
帮助的人:979万
展开全部
代码看不出什么问题,count(*) 必然会返回值的,不需要用nvl函数 直接 if s_warn=0 then ..
不要用count(*) 很耗费资源的,要用exists
select case when exists(select * from s_warn where sno=x) then 1 else 0 end into s_warm from dual
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xiaogeputi
2011-11-23
知道答主
回答量:14
采纳率:0%
帮助的人:7.6万
展开全部
写的很好,很简洁。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dl_会飞的青蛙
2011-11-23 · TA获得超过2456个赞
知道大有可为答主
回答量:3294
采纳率:0%
帮助的人:3348万
展开全部
报的是什么错误 贴出来!~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式