sql5.docx
- 文档编号:2804099
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:47
- 大小:45.68KB
sql5.docx
《sql5.docx》由会员分享,可在线阅读,更多相关《sql5.docx(47页珍藏版)》请在冰豆网上搜索。
sql5
AS/400SQL-第五部分
第八章动态SQL应用
动态SQL允许在程序运行过程中定义和执行SQL语句。
提供动态SQL的应用程序接收字符串格式的输入(或建立)SQL语句,它不必知道将要运行的SQL语句的类型。
这些应用是:
建立或接受作为输入的SQL语句
为运行准备SQL语句
运行该SQL语句
处理SQL的返回码
交互的SQL,是动态SQL程序的例子。
SQL语句被交互SQL动态的处理和运行。
注:
1.在运行时,用动态SQL处理语句要优于静态SQL,其它的处理过程很类似,象预编译,联编,然后再运行。
因此,只有需要灵活的动态SQL的应用程序才需要使用它,其它的应用程序则应使用正常(静态)的SQL语句从数据库中访问数据。
2.包含EXECUTE或者EXECUTEIMMDIATE语句和使用FORREADONLY子句用游标只读的程序性能会更好,这是由于用游标可成块检索行。
CRTSQLxxx的选项ALWBLK(*ALLREAD)隐含FORREADONLY说明,因此对所有游标及引用游标的删除或更新定位,不用明显编写FORUPDATEOF,隐含有FORREADONLY的游标将从这个列表的第二项中得到帮助。
有些动态SQL语句要求使用地址变量,RPG/400程序需要PL/1、COBOL、C或者ILERPG/400程序来帮助管理地址变量。
这章中的例子都是PL/1的例子。
下表显示了AS/400的DB2所支持的语句,并且指出是否可以用在动态应用程序中。
表8-1.在动态应用中允许的SQL语句
SQL语句
静态SQL
动态SQL
ALTERTABLE
Y
Y
BEGINDECLARESECTION
Y
N
CALL
Y
Y
CLOSE
Y
N
COMMENTON
Y
Y
COMMIT
Y
Y
CONNECT
Y
N
CREATECOLLECTION
Y
Y
CREATEINDEX
Y
Y
CREATEPROCEDURE
Y
Y
CREATESCHEMA
N
见注8.
CREATETABLE
Y
Y
CREATEVIEW
Y
Y
DECLARECURSOR
Y
见注4.
DECLAREPROCEDURE
Y
N
DECLARESTATEMENT
Y
N
DECLAREVARIABLE
Y
N
DELETE
Y
Y
DESCRIBE
Y
见注7.
DESCRIBETABLE
Y
N
DISCONNECT
Y
N
DROP
Y
Y
ENDDECLARESECTION
Y
N
EXECUTE
Y
见注1.
EXECUTEIMMEDIATE
Y
见注2.
FETCH
Y
N
GRANT
Y
Y
INCLUDE
Y
N
INSERT
Y
Y
LABELON
Y
Y
LOCKTABLE
Y
Y
OPEN
Y
N
PREPARE
Y
见注3.
RELEASE
Y
N
RENAME
Y
Y
REVOKE
Y
Y
RLOOBACK
Y
Y
SELECTINTO
Y
见注5.
SELECTstatment
Y
见注6.
SETCONNECTION
Y
N
SETOPTION
Y
见注9.
SETRESULTSETS
Y
N
SETTRANSACTION
Y
Y
UPDATE
Y
Y
WHENEVER
Y
N
注:
1.不可准备,但可运行准备好的SQL语句。
必须在使用EXECUTE语句之前用PREPARE
语句准备。
SQL语句例子请看8.2.2。
2.不可准备,但可用没有任何?
(问号)参数标志的动态语句字符串EXECUTE
IMMEDIATE语句可在程序运行期间动态的准备和运行语句字符。
例子请看8.2。
3.不可准备,但可在运行前用来分析语法、优化、设置动态的SELECT语句。
例子请
看8.2。
4.不可准备,但可在运行前定义联系动态SELECT语句的游标。
5.SELECTINTO语句不能准备或用在EXECUTEIMMEDIATE语句中。
6.不能与EXECUTE或者EXECUTEIMMEDIATE一起使用,但可用OPEN语句准
备和使用。
7.不可准备,但可用来返回准备语句的说明。
8.只可用RUNSQLSTM命令来运行。
9.只能用在运行REXX过程中。
8.1设计和运行动态SQL应用程序
为了运行一个动态SQL语句,必须使用EXECUTE或者EXECUTEIMMEDIATE语句,因为动态的SQL语句不必在预编译时准备,所以.必须在运行时准备。
EXECUTEIMMEDIATE语句使得SQL语句在程序运行时准备和动态运行。
有两种基本类型的动态SQL语句:
SELECT语句和Non-SELECT语句。
Non-SELECT语句包括DELETE,INSERT,UPDATE这样的语句。
典型的使用ODBC接口的客户服务应用程序使用动态的SQL来访问数据库。
详细信息,请看ClientAccessforWindows3.1ODBC用户指南。
8.2处理Non-SELECT语句
要创建一个动态的SQLNon-SELECT语句有以下二步:
1.确定要创建的SQL语句可以在动态下运行。
2.创建SQL语句(使用交互式SQL是一种简单的创建确认运行方法,详细内容请看第十七章。
)
要运行动态SQLNon-SELECT语句:
1.用EXECUTEIMMEDIATE语句运行,或用PREPARE语句,然后用EXECUTE执行准备好的语句。
2.处理SQL产生的返回码。
下面是一个运行动态SQL应用程序的例子:
EXECSQL
EXECUTEIMMEDIATE:
字符串
8.2.1动态SQL语句的CCSID
SQL语句是一个正规的主变量。
主变量的CCSID用作语句正文的CCSID。
在PL/1中,它也可以是一个串表达式。
在这种情况下,作业的CCSID作为语句正文的CCSID来使用。
动态SQL语句用语句正文的CCSID来处理。
这对不同字符的影响最大。
例如,(用CCSID500分配为’BA’X,即是说,如果语句正文的CCSID是500,SQL认为(分配为’BA’X,如果语句正文的CCSID为65535,SQL处理可变字符就象它们的CCSID为37一样,即把(解释为’5F’X
8.2.2使用PREPARE和EXECUTE语句
如果Non-SELECT语句中包含无参数标记,那么可以用EXECUTEIMMEDIATE语句来动态的运行。
但如果Non-SELECT语句中有参数标记,那么必须用PREPARE和EXECUTE来运行。
PREPARE语句准备Non-SELECT语句(例如DELETE语句)并且给它一个你所选择的名字,如果在CRTSQLxxx命令中规定了DLYPRP(*YES),那么准备工作将延迟到第一次在EXECUTE或DESCRIBE语句中使用它时,除非在PREPARE语句中具体规定了USING子句。
在这个例子中,我们称它为S1。
在语句准备好后,可以对参数标记使用不同的值,在同一个程序内运行多次。
下面是PREPARE语句使用多次的例子:
DSTRING='DELETEFROMCORPDATA.EMPLOYEEWHEREEMPNO=?
';
/*The?
isaparametermarkerwhichdenotes
thatthisvalueisahostvariablethatis
tobesubstitutedeachtimethestatementisrun.*/
EXECSQLPREPARES1FROM:
DSTRING;
/*DSTRINGisthedeletestatementthatthePREPAREstatementis
namingS1.*/
DOUNTIL(EMP=0);
/*TheapplicationprogramreadsavalueforEMPfromthe
displaystation.*/
EXECSQL
EXECUTES1USING:
EMP;
END;
上面的例子与例行程序相似,必须知道参数标记的个数以及它们的类型,这是提供输入数据的主变量在写程序时说明的。
注:
当应用程序一旦终结,所有与应用程序相联系的准备语句将被撤销。
它们之间的连接由CONNECT(类型1)语句,DISCONNECT语句或在成功的落实之后的一个RELEASE来结束。
8.3处理SELECT语句和使用SQLDA
有两个基本的SELECT语句类型:
固定列表,可变列表。
处理一个固定列表的SELECT语句,不需要SQLDA。
处理一个可变列表的SELECT语句,首先要说明SQLDA结构。
SQLDA是一个控制模块,用来从应用程序传送主变量输入值到SQL中,及从SQL接收输出值。
另外,有关SELETE列表表达式信息可以用PREPARE或DESCRIBE语句返回。
8.3.1固定列表的SELECT语句
在动态SQL中,固定列表SELECT语句是为了检索那些预先知道数值和类型的数据的语句。
使用这些语句时,可以预料并定义主变量来容纳取出来的数据,因此SQLDA是不必要的。
每次成功的FETCH都返回与上一次相同数量的值,并且这些数据有与上次FETCH返回值相同的数据格式。
可以规定主变量,适用于任何SQL应用程序。
可以在任何SQL支持的应用程序中使用固定列表的SELECT语句。
为了动态运行固定列表SELECT语句,应用程序必须:
1.把输入的SQL语句放入主变量中。
2.发出一个PREPARE语句来验证动态SQL语句并把它放到一个可运行的格式中。
如
果在CRTSQLxxx命令中规定了DLYPRP(*YES),那么准备将推迟到该语句第一次
用在EXECUTE或DESCRIBE语句中,除非在PREPARE语句中规定了USING子句。
3.为语句名说明一个游标。
4.打开游标。
5.取出一行放在变量的固定列表中(而不是放入描述符区)。
6.在到达数据末时,关闭游标。
7.处理产生的返回代码。
例如:
MOVE'SELECTEMPNO,LASTNAMEFROMCORPDATA.EMPLOYEEWHEREEMPNO>?
'
TODSTRING.
EXECSQL
PREPARES2FROM:
DSTRINGEND-EXEC.
EXECSQL
DECLAREC2CURSORFORS2END-EXEC.
EXECSQL
OPENC2USING:
EMPEND-EXEC.
PERFORMFETCH-ROWUNTILSQLCODENOT=0.
EXECSQL
CLOSEC2END-EXEC.
STOP-RUN.
FETCH-ROW.
EXECSQL
FETCHC2INTO:
EMP,:
EMPNAMEEND-EXEC.
注:
记住,在这种情况下,由于SELECT语句总是返回与先前运行固定列表SELECT相同的数值与类型,不必一定使用SQLDA。
8.3.2可变列表的SELECT语句
在动态SQL中,可变列表的SELE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sql5
![提示](https://static.bdocx.com/images/bang_tan.gif)