动态SQL的oracle实现
例如,有这样一个SQL语句:
选择=========和(t.created > = to_date(' | | to_char(SYSDATE,'yyyy-mm-dd)| | ',''yyyy-mm-ddt.created <(| | to_char)to_date(SYSDATE + 1,'yyyy-mm-dd)| | '双,''yyyy-mm-dd));
它把系统日期转换为字符串,然后将字符串转换成日期生成的SQL。
结果如下:
=========和(t.created > = to_date('2012-11-08 ','yyyy-mm-dd)和t.created < to_date('2012-11-09 ','yyyy-mm-dd '))
字符串2012-11-08产生to_char(SYSDATE,'yyyy-mm-dd)。句子中所引用的每一个引号都写在两个引号中以逃避意义。
虽然组装的过程非常令人讨厌,但只要掌握了三个点,就可以组装可以使用的SQL语句。
首先,确定目标。确保SQL应该是什么样子,然后配置动态SQL
二,当组装SQL,使用连接器| |连接对象是VARCHAR2类型,这种类型的对象开始带有单引号,单引号结束。数量会自动转弯,但日期要求我们使用to_char功能手动。
三,当有引号时,它们被写成两个单引号。
例如:我是一个SQL开发的' | | v_name | |在中国。电话是| | v_number | |'。
v_name是字符类型,所以需要加一个单引号之前和之后。
这种转变是很烦人的,但有一个新的特征从10g,不可太烦人了。它问{ }xxxxx
示例如下:
选择Q{我SQL开发}的| | to_char(SYSDATE,'yyyy)| | Q'{在中国..
结果如下:
我是一个SQL开发'2012'in中国。电话是1990。
我可以问{ }用单引号。
to_char(SYSDATE,'yyyy)转换为2012,用单引号前后。所以最后的问{ } 'plus xxx单引号。
因此,我们不必使用任何以前代表一个引号。
总之,要掌握这三个点,我们应该能够组装可以使用的SQL。如果使用绑定变量来输入输出,则需要使用使用关键字。
进行设置;
声明
输入日期:= sysdate-10;
即将离任的int;
开始
执行immediate'select计数(*)从哪里user_objects创建> incoming'into外出使用;
dbms_output.put_line(count是:| |外向);
结束;
利用的好处是,你不必把日期类型为VARCHAR类型然后回日期类型等繁琐操作。
SQL代码如下所示:
声明
输入日期:= sysdate-10;
即将离任的int;
开始
执行immediate'insert为t_object(一)select count(*)从哪里user_objects创建>;
dbms_output.put_line(count是:| |外向);
结束;
的ora-01007:变量不在选择列表
ora-06512:6行
汤姆解释说,这个错误是这样的:随访2004年11月24日-7中央时区:
你必须用dbms_sql输出的数量是不
SQL代码如下所示:
声明
v_cursor数;-一个游标定义
v_string VARCHAR2(2999);
v_row数;
开始
v_string:= 'insert为t_object(一)select count(*)从哪里创造user_objects >:哪里;——操作语句,即:变量是确定句子的价值,当它运行时。
v_cursor:= dbms_sql.open_cursor;打开光标处理
dbms_sql.parse(v_cursor,v_string,dbms_sql。母语);-说明
dbms_sql.bind_variable(v_cursor,':传入,sysdate-30);——给变量赋值给变量
v_row:= dbms_sql.execute(v_cursor);-执行语句
dbms_sql.close_cursor(v_cursor);-关闭游标
--dbms_output.put_line(v_row);
承诺;
例外
当别人然后
dbms_sql.close_cursor(v_cursor);-关闭游标
回降;
结束;