动态sql与静态sql.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态sql与静态sql

动态sql与静态 动态vs静态 大多数应用程序在设计时都使用静态sql和fixed事务.这样,在运行之前就已经知道要运行的sql;这也就是说你已经知道哪些sql要执行,需要操作哪些表,要更新哪些数据等等. 然而,有些程序需要在运行时处理所有sql.所以你有可能在运行时才能知道这些sql,和需要用到的列名和表名.动态sql是一种可以让你的程序在运行时处理或者生成动态sql的一种高级编程技巧,并且还可以进行显式的数据转换. ORACLE动态sql 什么是动态sql 大部分程序在编译时已经知道更新哪个表,哪个字段,和字段的数据类型. 但是,还有一些程序必须处理不确定的sql,例如通用报表必须使用不同的select语句.这样的话sql只有到运行的时候才能确定,这样的语句就叫做动态sql.和静态sql不一样,动态语句可以存储在字符串里,也可以从文件中读取,还能在运行的时候通过用户输入拼装出来. 动态sql的优点 程序使用动态sql要比使用静态sql灵活很多.动态sql可以实现交互.这样的动态sql可以实现高灵活性的编码. 动态sql缺点 但是动态sql又需要高复杂度的编码,,并且需要用到特殊的数据结构,同时增加程序运行时的处理量. 增加程序运行时间,提高编写难度. 何时需要用到动态sql 静态sql可以满足大部分的需求,当你需要无限扩展的灵活性时需要用到动态sql. 在以下其中之一不确定的时候需要用到动态sql: sql语句 变量个数 变量类型 对象 动态sql如何工作 首先检查语法.然后将变量绑定到sql上,oracle将得到变量的地址这样就可以读写了. 然后,执行这些sql,根据sql更新,删除.这些sql可以用不同的新值替换,然后重复执行. 使用动态sql的方法 方法一 使用EXECUTE IMMEDIATE,不能包含select,不能包含带有变量的占位符.例如: DELETE FROM EMP WHERE DEPTNO = 20 GRANT SELECT ON EMP TO scott 方法二 使用PREPARE 和 EXECUTE,sql不能包含select,在编译的时候变量的个数和数据类型必须是已知的.例如: INSERT INTO EMP (ENAME, JOB) VALUES (:emp_name, :job_title) DELETE FROM EMP WHERE EMPNO = :emp_number 方法三 使用DECLARE, OPEN, FETCH, CLOSE cursor可以使用select,并且select字段的个数,变量占位符,变量类型在编译时必须是已知的.例如: SELECT DEPTNO, MIN(SAL), MAX(SAL) FROM EMP GROUP BY DEPTNO SELECT ENAME, EMPNO FROM EMP WHERE DEPTNO = :dept_number 方法四 这种方法可以在运行时确定select个数,变量个数,变量数据类型.例如: INSERT INTO EMP (unknown) VALUES (unknown) SELECT unknown FROM EMP WHERE DEPTNO = 20 如何选择动态sql 方法举例和分析 方法一 char dyn_stmt[132]; ... for (;;) { printf(Enter SQL statement: ); gets(dyn_stmt); if (*dyn_stmt == \0) break; /* dyn_stmt now contains the text of a SQL statement */ EXEC SQL EXECUTE IMMEDIATE :dyn_stmt; } ... 上面就是方法一,也可以使用下面的代替: EXEC SQL EXECUTE IMMEDIATE REVOKE RESOURCE FROM MILLER; 但是EXECUTE IMMEDIATE在每次执行之前都要进行解析,所以方法一最适用的是一次性sql.一般用来执行DDL 方法二 语法:EXEC SQL PREPARE statement_name FROM { :host_string | string_literal }; Prepare一次,但是可以循环执行很多次. 方法三 语法: PREPARE statement_name FROM { :host_string | string_literal }; DECLARE cursor_name SCROLL CURSOR FOR statem

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档