您好,欢迎访问一九零五行业门户网

Oracle动态SQL的拼装要领

oracle的动态sql语句用起来很方便,但其拼装过程太烦人。尤其在拼装语句中涉及到date类型字段时,拼装时要加to_char先转换成字符
oracle的动态sql语句用起来很方便,但其拼装过程太烦人。尤其在拼装语句中涉及到date类型字段时,拼装时要加to_char先转换成字符,,到了sql中又要使用to_date转成date类型和原字段再比较。
例如这样一个sql:
select '=========  and (t.created>=to_date('''||to_char(sysdate,'yyyy-mm-dd')||''',''yyyy-mm-dd'') and t.created
它就是将sysdate转成字符串,再在生成的sql中将字符串转换成date。
拼装出来的结果如下:
=========  and (t.created>=to_date('2012-11-08','yyyy-mm-dd') and t.created
字符串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; 
结果如下:
result代码
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;
 /
其它类似信息

推荐信息