oracle动态sql 换行,Oracle实现动态SQL的拼装要领



虽说Oracle的动态SQL语句使用起来确实很方便,但是其拼装过程却太麻烦。尤其在拼装语句中涉及到date类型字段时,拼装时要加to_char先转换成字符,到了sql中又要使用to_date转成date类型和原字段再比较。

例如有这样一个SQL语句:

and(t.created>=to_date('2012-11-08','yyyy-mm-dd')ANDt.created< to_date('2012-11-09','yyyy-mm-dd'))

字符串2012-11-08是我们使用to_char(sysdate,’yyyy-mm-dd’)生成的,语句中涉及到的每一个单引号,都要写成两个单引号来转义。

虽然拼装过程很烦人,但只要掌握好三点,就应能拼装出能用的SQL语句。

一、先确定目标。应保证拼装出来的SQL应该是什么样子,然后再去配置那个动态SQL

二、拼装SQL的时候,所有使用连接符||连接的对象都应是varchar2类型,这种类型的对象以单引号开头,以单引号结尾。数字会自动转,但date需要我们手工使用to_char函数转。

三、遇到有引号的,就写成两个单引号。

如 ‘ I am a SQL developer ” ‘||v_name||’ ” in China. telephone is ‘||v_number||’ .’

v_name是字符型的,所以拼装它是需要前后加单引号。

这种转换很烦人,但从10g开始有一个新功能,可以让人不用这么烦。它就是q'[xxxxx]’

示例

select q'[ I’m a SQL developer ‘ ]’||to_char(sysdate,’yyyy’)||q'[‘ in China. telephone is ]’||1990||’.’ from dual;

结果  I’m a SQL developer ‘2012’ in China. telephone is 1990

I’m使用一个单引号在q'[]’中就可以。

to_char(sysdate,’yyyy’)转成的是2012,前后是要加单引号的。所以在q'[xxx ‘]’的结尾加了一个单引号。

这样就使得我们不用想以前那样使用 ””表示一个单引号了。

简而言之,掌握这三点,就应该能拼装出能用的SQL。至于如果使用绑定变量输入输出,则需要使用into using关键字。

set serveroutput on;

declare

incoming date:=sysdate-10;

outgoing int;

begin

execute immediate ‘select COUNT(*) FROM user_objects where created > :incoming’ into outgoing using incoming ;

dbms_output.put_line(‘ count is: ‘ || outgoing);

end;

使用using的好处,就是不用去转date类型为varchar类型,再转回去date类型这种繁琐的操作。

SQL代码如下:

declare

incoming date:=sysdate-10;

outgoing int;

begin

execute immediate ‘insert into t_object(a) select COUNT(*) FROM user_objects where created > :incoming’ into outgoing using incoming ;

dbms_output.put_line(‘ count is: ‘ || outgoing);

end;

本文由【waitig】发表在等英博客 本文固定链接:Oracle实现动态SQL的拼装要领 欢迎关注本站官方公众号,每日都有干货分享!

点赞 (0)赏分享 (0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值