请教,动态处理的问题。谢谢

jeRKer 2009-12-24 06:50:44
declare intablename varchar2(200):='test_zkm';
pkfieldname varchar2(200);
vsql varchar2(500);
swapvalue integer:=0;
outvalue varchar2(500);
BEGIN
--select count(1) into outvalue from test_zkm where tid='1';
pkfieldname := '';
vsql := 'select a.column_name from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P''';
--怎么处理数据为null的情况?
execute immediate vsql into pkfieldname using upper(intablename);
if nvl(pkfieldname,'')= '' then
dbms_output.put_line('the result is null or is empty');
outvalue := '';
else
dbms_output.put_line('the result is not null');
--处理最大值
vsql := 'select max(' || pkfieldname || ') from ' || intablename;
--怎么处理数据为null的情况?
execute immediate vsql into swapvalue;
swapvalue:= swapvalue +1;
outvalue := swapvalue;
end if;
dbms_output.put_line(outvalue);
END;

--备注
以上是代码,我的问题是在执行 execute immediate vsql into pkfieldname using upper(intablename);的时候当结果为null的情况下如何处理,除了在这之前用count先判断的方法,谢谢
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeRKer 2009-12-25
  • 打赏
  • 举报
回复
多谢,刚学oracle,请多指教
huangyunzeng2008 2009-12-24
  • 打赏
  • 举报
回复
通过nvl可以处理的!也可以通过decode来转一下!
小灰狼W 2009-12-24
  • 打赏
  • 举报
回复
vsql := 'select max(' || pkfieldname || ') from ' || intablename

这句执行,如果pkfieldname指向的字段为空,也不会有语法错误,只会返回空值。可以不处理,也可以加nvl,decode等函数来转换
小灰狼W 2009-12-24
  • 打赏
  • 举报
回复
declare intablename varchar2(200):='test_zkm'; 
pkfieldname varchar2(200);
vsql varchar2(500);
swapvalue integer:=0;
outvalue varchar2(500);
BEGIN
--select count(1) into outvalue from test_zkm where tid='1';
vsql := 'select max(a.column_name) from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P''';
--使用聚合函数,如果没有符合条件的记录,返回空值。
execute immediate vsql into pkfieldname using upper(intablename);
if pkfieldname is null then
dbms_output.put_line('the result is null or is empty');
--outvalue := ''; 这个没有必要,没有赋值默认就是null
else
dbms_output.put_line('the result is not null');
--处理最大值
vsql := 'select max(' || pkfieldname || ') from ' || intablename;
--怎么处理数据为null的情况?
execute immediate vsql into swapvalue;
swapvalue:= swapvalue +1;
outvalue := swapvalue;
end if;
dbms_output.put_line(outvalue);
END;
crazylaa 2009-12-24
  • 打赏
  • 举报
回复
3楼不错
BenChiM888 2009-12-24
  • 打赏
  • 举报
回复
总体来讲没看明白你的匿名块是干嘛用的,不过你的要求倒是可以实现。


declare
intablename varchar2(200):='test_zkm';
pkfieldname varchar2(200);
vsql varchar2(500);
swapvalue integer:=0;
outvalue varchar2(500);
BEGIN
pkfieldname := ''; --因为这里初始化是NULL,所以不用考虑第一个sql语句返回NULL的情况
vsql := 'select a.column_name from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P'''; --这里我没看懂,你找出主键所在列干嘛用,他存不存在和[result is null or is empty]有什么关系?况且如果是复合主键直接报too_many_rows异常。
execute immediate vsql into pkfieldname using upper(intablename);
if nvl(pkfieldname,'')= '' then
dbms_output.put_line('the result is null or is empty');
outvalue := '';
else
dbms_output.put_line('the result is not null');
vsql := 'select nvl(max(' || pkfieldname || '),0) from ' || intablename;
--这里加了一个nvl函数就能满足你的要求。
execute immediate vsql into swapvalue;
swapvalue:= swapvalue +1;
outvalue := swapvalue;
end if;
dbms_output.put_line(outvalue);
END;
碧水幽幽泉 2009-12-24
  • 打赏
  • 举报
回复
当结果为null的情况下:

select 0 from dual where 1 = 0;
zhangwonderful 2009-12-24
  • 打赏
  • 举报
回复
null值通过nvl来解决吧。

17,090

社区成员

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

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