文章
· 三月 2, 2023 阅读大约需 4 分钟

全球征文大赛选集 - 使用 %Query 教程第一篇#1

正式名称为Class Query 的意思可以追溯到 Caché 的早期。
使用CLASS是因为它嵌入在 COS 类中。
尽管官方文档中有精确的描述,但它仍然相当抽象。
我的教程应该通过 COS 中的一个简单示例逐步指导您,使您有直观的体会

  • GitHub上提供了所有代码示例
  • 所有示例都可以从终端、控制台或 Web 终端执行。
  • 我使用位于 %ZLANGC00.INT 中的个人命令ZZQ进行测试和演示,它运行 SQL Shell >>> "DO $system.SQL.Shell()"
  • SQL Shell 以交互方式运行并允许对代码进行简单的调试
  • 最后,我使用 Studio,因为它包含一个非常方便的 ClassQueries 向导

介绍

对于任何演示或教程,都需要一些测试数据。
我的简单表/类设计只有 4 列:

  • ID
  • 城市
  • 姓名
  • 年龄
  • 溪流

虽然前 4 种是相当普通的数据类型,但很容易映射到 SQL Stream 提供了使用类查询进行显示的挑战。
想法:如果这是一个病人记录,那么一些大的流文档可能会直接关联到该记录。该类被定义为 [Final] 以保持 Global 更具可读性。

演示内容是使用 %Populate Utility 生成的。因此,您的数据内容看起来与此处不同,除非%Populate 不提供服务的流。
在这里,我生成了一些随机分成几个部分的文本,使用 || (双管道)作为段分隔符。
(注意!这不是 %Populate Utility 的教程!)

为了模拟删除的缺失内容
ID=4 的流以及整个 ID=3 的流。

很简单
USER>执行 ##class(rcc.TU).Populate(8)
USER> kill ^rcc.TUD(3) ;;做一个差距
USER>设置 $LI(^rcc.TUD(4),4)="" ;;没有流

所以这是演示表/类

USER> zwrite ^rcc .TUD ^rcc .TUD= 8 ^rcc .TUD( 1 )= $lb ( "Bensonhurst" , "Kovalev" , 16 , "1" ) ^rcc .TUD( 2 )= $lb ( "Queensbury" , "Yeats" , 15 , "2" ) ^rcc .TUD( 4 )= $lb ( "Newton" , "Evans" , 61 , "" ) ^rcc .TUD( 5 )= $lb ( "Hialeah" , "Zemaitis" , 47 , "5" ) ^rcc .TUD( 6 )= $lb ( "Elmhurst" , "Jenkins" , 29 , "6" ) ^rcc .TUD( 7 )= $lb ( "Islip" , "Drabek" , 61 , "7" ) ^rcc .TUD( 8 )= $lb ( "Islip" , "Kovalev" , 88 , "8" )


案例%SQLquery

您创建一个空类框架 ( rcc.TU0 ) 并让向导添加一个查询

它会指导您完成所有必需的参数:
我们首先创建一个基本类查询

并添加我们的输入参数(我只有 1 个)



这就是结果

这还不是很令人印象深刻,您需要添加更多参数 + 您的查询!
您可以通过键入或使用了解所有引号和括号的 Studio 的 Inspector 来完成

  • CONTAINID 在结果行中定义您的 ID 列
  • SqlProc 表示您的查询可以用作过程(我们将这样做)
  • SqlName = Q0在你的类包中分配一个名称(主要是更简单)
  • 最重要的:你的 SQL 语句应用你的输入参数作为主变量

所以它看起来像这样:

这有什么用?

  • 这当然是最简单的说法。通常,您会将它用于相当复杂的 SQL 语句,这些语句现在已冻结,并且作为 SQL 过程在内部任何地方可用或来自某些外部 ODBC 或 JDBC 客户端
  • 所有 ODBC/JDBC 协议都已为您的查询预编译。
  • 它看起来像嵌入式 SQL,但您没有陷入类方法中。
  • 内部它可用于 %ResultSet,或 %SQL.Statement 或 $system.SQL.Shell()
  • 直接使用 -----100----- 或作为子选择 -----101-----

它看起来像这样:

  •  USER> do $system .SQL.Shell() SQL Command Line Shell ---------------------------------------------------- The command prefix is currently set to: <<nothing>>. Enter q to quit , ? for help. [SQL]USER>>call rcc.q0( 4 ) 3. call rcc.q0( 4 ) Dumping result # 1 ID Age City Name Stream 1 16 Bensonhurst Kovalev " 1 %Stream.GlobalCharacter ^rcc.TUS" 2 15 Queensbury Yeats " 2 %Stream.GlobalCharacter ^rcc.TUS" 4 61 Newton Evans 5 47 Hialeah Zemaitis " 5 %Stream.GlobalCharacter ^rcc.TUS" 4 Rows( s ) Affected statement prepare time( s )/globals/lines/disk: 0.0003 s / 11 / 583 / 0 ms execute time( s )/globals/lines/disk: 0.0006 s / 4 / 1515 / 0 ms cached query class : %sqlcq.USER.cls 77 ---------------------------------------------------------------------------
  •  [SQL]USER>>SELECT Id, age, name FROM rcc.Q0( 99 ) where AGE > 21 6. SELECT Id, age, name FROM rcc.Q0( 99 ) where AGE > 21 ID Age Name 4 61 Evans 5 47 Zemaitis 6 29 Jenkins 7 61 Drabek 8 88 Kovalev 5 Rows( s ) Affected statement prepare time( s )/globals/lines/disk: 0.0726 s / 45969 / 214801 / 0 ms execute time( s )/globals/lines/disk: 0.0016 s / 123 / 2486 / 0 ms cached query class : %sqlcq.USER.cls 81 ---------------------------------------------------------------------------

您会立即明白,您得到的不是 Stream 内容,而是神秘的 StreamReference

跟随我进入基于自定义代码的查询的 下一章

只是提醒:
所有测试数据都是使用系统方法 %Populate 生成的
所以你的输出会有所不同。我建议您也使用其他参数运行我们的测试
比显示的示例更能发挥该工具的全部功能。

GitHub上再次提供了完整的代码示例

视频仍在制作中

要立即访问,您可以使用Demo Server WebTerminal
以及演示服务器 SMP上的相关系统管理门户

我希望您喜欢,期待您的投票。

讨论 (0)1
登录或注册以继续