欢迎来到天天文库
浏览记录
ID:14438225
大小:70.50 KB
页数:30页
时间:2018-07-28
《动态sql与绑定变量》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、动态SQL与绑定变量动态SQL与绑定变量(初稿转载)http://space.itpub.net/12474069/viewspace-6211571什么是动态SQL(DynamicSQL)动态SQL使你在运行时,以字符串的形式构造SQL语句。这些语句包含在PL/SQL块中,并且常常包含占位符来使用绑定变量。这一点于静态SQL是不同的。静态SQL在编译时就固定了。由于在编译时SQL的全文还不确定,所以你可使用动态SQL构建灵活的,多用途的应用程序。可以在PL/SQL,Pro*C/C++,andJava这几种不同的开发环境中使用动态SQL。举一个使用动态
2、SQL的例子,比如在一个数据仓库的环境中,在运行时才知道表的名字。这些表是以年月来明明的,例如:inv_01_2003,inv_04_2003,inv_07_2003,inv_10_2003,inv_01_2004,等等。你可以在报表程序中运行时定义这些表的名字。 再举另外一个例子,你现在要运行一个复杂的查询,并且排序字段是要由用户来选择。为了不因为排序顺序的改变而编写更多的查询语句,你可以使用一个包含定义的排序子句的动态SQL.2为什么要使用动态SQL静态SQL和动态SQL都有各自的优缺点静态SQL的优点是:编译成功就表示访问的数据库对象有效并且有权
3、限来访问数据库的对象。静态SQL的性能一般要好于动态SQL尽管如此,静态SQL也有他的局限,而这些局限动态SQL却能克服。下面列举了这些局限 不知道PL/SQL中语句的全文。这些语句也许依赖于传入参数,或者需要程序进行处理而得到。 执行DDL语句或者其他静态SQL不支持的语句需要一个应对不同的数据定义,而不需要重新编译的程序。动态SQL比静态SQL更加灵活,因为它可以构造出面对不同环境都可重用的代码。作为一般的准则,你应该在静态SQL不能达到目标,或者使用静态SQL比较繁杂的时候使用动态SQL。下面列举出使用动态SQL的典型情况。在PL/SQL中运行D
4、atadefinitionlanguage(DDL)和Sessioncontrollanguage(SCL)运行动态查询参照在编译时不存在的对象为了更佳的性能3避免写动态SQL使用DECODE,CASE构造半动态SQL上图是淘宝网中手机选项。经常有这样的需求。如果输入手机型号那么就用手机型号筛选,如果没有输入那么就不用筛选了。常规解决办法动态SQL查询Adeclarec1SYS_REFCURSOR;i_phone_namevarchar2(20);i_phone_typevarchar2(20)
5、;i_phone_servicevarchar(20);v_sqlvarchar2(2000);rphone_info%rowtype;begini_phone_name:='''SYS''';v_sql:='select*fromphone_infowhere1=1';ifi_phone_nameisnotnullthenv_sql:=v_sql
6、
7、'andWNER='
8、
9、i_phone_name;endif;ifi_phone_typeisnotnullthenv_sql:=v_sql
10、
11、'andOBJECT_NAME='
12、
13、i_phone_typ
14、e;endif;ifi_phone_serviceisnotnullthenv_sql:=v_sql
15、
16、'andOBJECT_ID='
17、
18、i_phone_service;endif;v_sql:=v_sql
19、
20、'andrownum<20';dbms_output.put_line(v_sql);openc1forv_sql;fetchc1intor;while(c1%found)loopnull;dbms_output.put_line('OBJECT_NAME='
21、
22、r.OBJECT_NAME);fetchc1intor;endloop;closec
23、1;end;输出结果select*fromphone_infowhere1=1andrownum<20OBJECT_NAME=ICOL$OBJECT_NAME=I_USER1OBJECT_NAME=CON$OBJECT_NAME=UNDO$OBJECT_NAME=C_COBJ#OBJECT_NAME=I_OBJ#OBJECT_NAME=PROXY_ROLE_DATA$OBJECT_NAME=I_IND1OBJECT_NAME=I_CDEF2OBJECT_N
24、AME=I_PROXY_ROLE_DATA$_1OBJECT_NAME=FILE$OBJECT
此文档下载收益归作者所有