第十一章 以编程方式使用 SQL 网关
注意:本节假设具有使用 ODBC API
调用的丰富经验 - 它无意提供有关如何使用 ODBC
函数的详细信息。如果遇到任何问题,可以通过启用 IRIS
和 ODBC
日志记录来监视 SQL
网关。
FetchSamples
示例 — 列出一个打开连接、运行查询并访问结果集的简单程序。- 创建和使用外部数据集 — 演示使用
%SQL.Statement
方法来运行查询和访问数据集。 - 直接调用
ODBC
函数 — 演示如何直接调用ODBC
查询函数,而不是通过的%SQL.Statement
。 %SQLGatewayConnection
快速参考 — 提供有关支持的方法和属性的详细信息。
在本章的其余部分中,%Library.SQLGatewayConnection
通过其缩写名称 %SQLGatewayConnection
来引用。
获取样本示例
以下示例简单演示了如何打开连接、准备和执行查询以及访问结果数据集。
ClassMethod FetchSamples()
{
#include %occInclude
//Create new SQL Gateway connection object
set gc=##class(%SQLGatewayConnection).%New()
if gc=$$$NULLOREF quit $$$ERROR($$$GeneralError,"Cannot create %SQLGatewayConnection.")
//Make connection to target DSN
set pDSN="Cache Samples"
set usr="_system"
set pwd="SYS"
set sc=gc.Connect(pDSN,usr,pwd,0)
if $$$ISERR(sc) quit sc
if gc.ConnectionHandle="" quit $$$ERROR($$$GeneralError,"Connection failed")
set sc=gc.AllocateStatement(.hstmt)
if $$$ISERR(sc) quit sc
//Prepare statement for execution
set pQuery= "select * from Sample.Person"
set sc=gc.Prepare(hstmt,pQuery)
if $$$ISERR(sc) quit sc
//Execute statement
set sc=gc.Execute(hstmt)
if $$$ISERR(sc) quit sc
//Get list of columns returned by query
set sc=gc.DescribeColumns(hstmt, .columnlist)
if $$$ISERR(sc) quit sc
//display column headers delimited by ":"
set numcols=$listlength(columnlist)-1 //get number of columns
for colnum=2:1:numcols+1 {
Write $listget($listget(columnlist,colnum),1),":"
}
write !
//Return first 200 rows
set sc=gc.Fetch(hstmt)
if $$$ISERR(sc) quit sc
set rownum=1
while((gc.sqlcode'=100) && (rownum<=200)) {
for ii=1:1:numcols {
set sc=gc.GetData(hstmt, ii, 1, .val)
write " "_val
if $$$ISERR(sc) break
}
set rownum=rownum+1
write !
set sc=gc.Fetch(hstmt)
if $$$ISERR(sc) break
}
//Close cursor and then disconnect
set sc=gc.CloseCursor(hstmt)
if $$$ISERR(sc) quit sc
set sc=gc.Disconnect()
quit sc
}
创建和使用外部数据集
要创建和使用查询外部数据库的数据集,请执行以下操作:
- 通过
%New()
方法创建%SQLGatewayConnection
的实例。 - 调用该实例的
Connect()
方法,传递指定ODBC
数据源名称的参数,以及登录该源所需的用户名和密码(如有必要)。
Connect()
方法具有以下签名:
method Connect(dsn, usr, pwd, timeout) as %Status
这里的dsn
是数据源的DSN
,usr
是可以登录该数据源的用户,pwd
是对应的密码,timeout
指定等待连接的时间。
- 通过
%New()
方法创建%ResultSet
的实例,并提供字符串参数“%DynamicQueryGW:SQLGW
”。
注意:这与典型动态查询(“%DynamicQuery:SQL
”)使用的参数略有不同。
- 调用结果集的
Prepare()
方法。第一个参数应该是由 SQL 查询组成的字符串,第二个参数应该被省略,第三个参数是%SQLGatewayConnection
的实例。 - 调用结果集的
Execute()
方法,可以选择按查询期望的顺序提供任何参数。此方法返回一个状态,应检查该状态。
要使用结果集,通常一次检查一行。可以在使用 %ResultSet
的方法来检索信息,例如给定列中的值。通常,可以使用 Next()
迭代所有行,如以下示例所示:
ClassMethod SelectAndWrite() as %Status
{
Set conn=##class(%SQLGatewayConnection).%New()
Set sc=conn.Connect("AccessPlayground","","")
If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit
Set res=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
Set sc=res.Prepare("SELECT * FROM PEOPLE",,conn)
If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit
Set sc=res.Execute()
If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit
While res.Next()
{ Write !,res.GetData(1)," ",res.GetData(2)," ",res.GetData(3)
}
Set sc=conn.Disconnect()
Quit sc
}