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

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

注意:本节假设具有使用 ODBC API 调用的丰富经验 - 它无意提供有关如何使用 ODBC 函数的详细信息。如果遇到任何问题,可以通过启用 IRIS 和 ODBC 日志记录来监视 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是数据源的DSN,usr是可以登录该数据源的用户,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
}
相关推荐
IT_陈寒12 分钟前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
XW32 分钟前
常用提示词(Prompt)框架总结
后端
工控丫丫39 分钟前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
ServBay39 分钟前
DeepSeek 再次崩了,DeepSeek V5正在路上?
后端·deepseek
jerrywus1 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
IT规划师1 小时前
编程术语中的同步与异步:从"等不等"到工程取舍
后端·面试
孟陬2 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
GoGeekBaird2 小时前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
Zhao-Jichao2 小时前
AI Prompting for Everyone 课程笔记 - P17 图像生成 Imaging Generation
前端
码事漫谈3 小时前
腾讯混元 Hy4 正式版发布了
后端