如何在ORACLE的游标中动态地构造SQL语句啊?

追寻梦中人 2005-10-11 11:36:25
现在有这样一条语句:
select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= PIFIRSTBIN
and f2 <= PILASTBIN;
我想这样:
当PIFIRSTBIN = ''时,SQL语句变为:
select nvl(sum(fqty),0) into vpickqty from table1
where f2 <= PILASTBIN;
当PILASTBIN = ''时,SQL语句变为:
select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= PIFIRSTBIN;
如果都为空是,SQL语句变为:
select nvl(sum(fqty),0) into vpickqty from table1;

这个除了用
if
select nvl(sum(fqty),0) into vpickqty from table1
where f2 <= PILASTBIN;
elsif
select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= PIFIRSTBIN;
else
select nvl(sum(fqty),0) into vpickqty from table1;
外还有什么其他办法吗?

如果这样的判断需要在游标里进行的话,
难道因为条件不同,需要写三个游标吗?
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyi8903 2005-10-12
  • 打赏
  • 举报
回复
嗯.是的.我的语句忘了执行:)

加上一句:
execute immediate l_sql;
bobfang 2005-10-12
  • 打赏
  • 举报
回复
应该不会没有记录的。你直接执行select nvl(sum(fqty),0) into vpickqty from table1的结果呢?
还有就是可以按sasacat(傻傻猫) 的写法,不过把=''改为is null。
select nvl(sum(fqty),0) into vpickqty from table1
where ((f2 <= PILASTBIN)or(PILASTBIN is null))
and ((f1 >= PIFIRSTBIN)or(PIFIRSTBIN is null))
sasacat 2005-10-12
  • 打赏
  • 举报
回复
select nvl(sum(fqty),0) into vpickqty from table1
where ((f2 <= PILASTBIN)or(PILASTBIN = ''))
and ((f1 >= PIFIRSTBIN)or(PIFIRSTBIN=''))
yown 2005-10-12
  • 打赏
  • 举报
回复
执行
动态sql

execute immediate sql;
bobfang 2005-10-11
  • 打赏
  • 举报
回复
如果f1和f2的值不可能为NULL,那么可以这样写
select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= nvl(PIFIRSTBIN,f1)
and f2 <= nvl(PILASTBIN,f2);
liuyi8903 2005-10-11
  • 打赏
  • 举报
回复
我写的不详细.大概就是这个思路:

DECLARE
l_sql VARCHAR2(20);
...
BEGIN
l_sql :='select nvl(sum(fqty),0) into vpickqty from table1 where ';
IF ... THEN
l_sql :=l_sql ||' f2 <= PILASTBIN';

ELSIF ... THEN
l_sql :=l_sql ||' f1 >= PIFIRSTBIN';
END IF;
...
END;
sasacat 2005-10-11
  • 打赏
  • 举报
回复
你的游标是什么语句啊?这些在游标内部执行不就行了吗。只是三个赋值语句还要用游标吗?
PILASTBIN和PIFIRSTBIN是哪来的?
追寻梦中人 2005-10-11
  • 打赏
  • 举报
回复
TO bobfang(匆匆过客) :

这条语句执行出来后,没有一条记录啊。。。

当PIFIRSTBIN和PILASTBIN为NULL时。。。

f1和f2不为NULL值:


select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= nvl(PIFIRSTBIN,f1)
and f2 <= nvl(PILASTBIN,f2);
追寻梦中人 2005-10-11
  • 打赏
  • 举报
回复
TO sasacat(傻傻猫) :
我的意思是我的游标里的select语句也得根据传入的PIFIRSTBIN和PILASTBIN参数才能确定WHERE语句的写法,就像是
select nvl(sum(fqty),0) into vpickqty from table1
where f1 >= PIFIRSTBIN
and f2 <= PILASTBIN;
这条语句一样。
比如说,
cursor c1(pifirstbin in varchar, pilastbin in varchar)
is
select * from table1
where f1 >= PIFIRSTBIN
and f2 <= PILASTBIN;
这里面的WHERE语句也得根据PIFIRSTBIN和PILASTBIN是否为空才能确定具体的SQL语句啊。。。

难道要写三个游标?

追寻梦中人 2005-10-11
  • 打赏
  • 举报
回复
TO liuyi8903(好好学习):
那l_sql什么时候执行?即vpickqty这个变量什么时候会有值啊?
bzszp 2005-10-11
  • 打赏
  • 举报
回复
楼上的方式即可,言简意赅。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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