第十一章 以编程方式使用 SQL 网关

第十一章 以编程方式使用 SQL 网关

注意:本节假设具有使用 ODBC API 调用的丰富经验 - 它无意提供有关如何使用 ODBC 函数的详细信息。如果遇到任何问题,可以通过启用 IRISODBC 日志记录来监视 SQL 网关。

  • FetchSamples 示例 --- 列出一个打开连接、运行查询并访问结果集的简单程序。
  • 创建和使用外部数据集 --- 演示使用 %SQL.Statement 方法来运行查询和访问数据集。
  • 直接调用 ODBC 函数 --- 演示如何直接调用 ODBC 查询函数,而不是通过的 %SQL.Statement
  • %SQLGatewayConnection 快速参考 --- 提供有关支持的方法和属性的详细信息。

在本章的其余部分中,%Library.SQLGatewayConnection通过其缩写名称 %SQLGatewayConnection来引用。

获取样本示例

以下示例简单演示了如何打开连接、准备和执行查询以及访问结果数据集。

java 复制代码
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
}

创建和使用外部数据集

要创建和使用查询外部数据库的数据集,请执行以下操作:

  1. 通过 %New() 方法创建 %SQLGatewayConnection的实例。
  2. 调用该实例的 Connect() 方法,传递指定 ODBC 数据源名称的参数,以及登录该源所需的用户名和密码(如有必要)。

Connect() 方法具有以下签名:

java 复制代码
method Connect(dsn, usr, pwd, timeout) as %Status

这里的dsn是数据源的DSNusr是可以登录该数据源的用户,pwd是对应的密码,timeout指定等待连接的时间。

  1. 通过 %New() 方法创建 %ResultSet 的实例,并提供字符串参数"%DynamicQueryGW:SQLGW"。

注意:这与典型动态查询("%DynamicQuery:SQL")使用的参数略有不同。

  1. 调用结果集的Prepare()方法。第一个参数应该是由 SQL 查询组成的字符串,第二个参数应该被省略,第三个参数是 %SQLGatewayConnection的实例。
  2. 调用结果集的 Execute() 方法,可以选择按查询期望的顺序提供任何参数。此方法返回一个状态,应检查该状态。

要使用结果集,通常一次检查一行。可以在使用 %ResultSet 的方法来检索信息,例如给定列中的值。通常,可以使用 Next() 迭代所有行,如以下示例所示:

java 复制代码
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
}
相关推荐
上进小菜猪3 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷4 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
泯泷4 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
考虑考虑4 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
步行cgn6 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
野槐7 小时前
前端项目优化(有了我,会发生...)
前端
aa小小7 小时前
【无标题】
前端
RISCV_Explorer8 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v
星栈独行8 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
计算机魔术师8 小时前
还在单线程跟 AI 聊天?Claude Code 并行多会话让你一个人干三个人的活
前端