- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 2016尔雅文化遗产概览【参考】.docx VIP
- 2025年江西省上饶市辅警协警笔试笔试真题(附答案).docx VIP
- 国开《学位论文指南》形考作业1-2答案.docx
- 和谐社会视野下中国基层行政伦理建设.doc VIP
- 股骨头骨骺炎胫骨结节骨骺炎.ppt VIP
- 和谐社会视野下中国基层行政伦理建设的论文.doc VIP
- 国际篮联的最新规则 .pdf VIP
- 辽宁省重点高中联合体2024-2025学年高一下学期期末考试语文试题及答案.docx VIP
- 儿童生存质量测定量表PedsQL4.0中文版的信度和效度分析.pdf VIP
- NB∕T 10877-2021 水电工程建设征地移民安置补偿费用概(估)算编制规范.pdf
原创力文档


文档评论(0)