0

背景

你好,

我使用基于 Unix 的应用程序,该应用程序使用 Intersystems Caché 数据库。由于我对 Caché 不太熟悉,直到最近我才发现我可以打字……

$ cache

...进入数据库。从这里,我发现我可以访问许多内容,例如%FREECNT报告、^DATABASE例程(查看/修改数据库的大小和其他属性)和$SYSTEM.SQL.Shell().

自从找到 以来$SYSTEM.SQL.Shell(),我发现了许多可以用来获取数据库信息的东西,特别是使用该%SYS.ProcessQuery表运行的进程。

我能够成功运行查询 - 例如:

USER>ZN "%SYS"
%SYS>D $SYSTEM.SQL.Shell()
SQL Command Line Shell             #Comment - Sql Shell Intro text
--------------------------------
Enter q to quit, ? for help.
%SYS>Select PID As Process_ID, State As Process_Status From %SYS.ProcessQuery

上面的查询将以这种格式返回结果:

Process_ID        Process_State
--------------------------------
528352            READ
2943582           HANG
707023            RUN

3 Rows(s) Affected
--------------------------------

问题

考虑到上面确定的背景,我正在寻找一种方法来仅返回没有“SQL 命令行外壳”介绍文本、列名或行计数页脚的结果。当我在 Unix 中编写 .ksh 脚本以连接到 Caché 并运行查询时,如上所示,我返回结果以及以下我不想包含的文本:

SQL Command Line Shell
--------------------------------
Enter q to quit, ? for help.

Process_ID        Process_State
--------------------------------

3 Rows(s) Affected
--------------------------------

附加信息

我意识到我可以使用 Unix 命令来过滤掉一些使用awkand的文本sed,但我正在寻找一些可能内置的更简单/更清洁的方法。也许有一个silentorno_column_names标志的东西,比如这个LINK中的例子。

我的最终游戏是运行一个脚本,该脚本将从查询中获取信息,然后在满足某些阈值时使用该信息对数据库进行更改。最终,我想安排脚本定期运行,因此我需要在服务器上进行所有处理,而不是创建一个单独的客户端应用程序来绑定到数据库。

4

2 回答 2

0

您想为此创建一个缓存例程。您可以在 Cache Studio 中执行此操作。 http://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=GSTD_Routines

在例程中,您想使用嵌入式 SQL 或动态 SQL 来运行查询,并遍历结果,并使用 WRITE 打印它们。我会推荐 Dynamic SQL,因为它在未来会更加灵活。

SQL 简介: http ://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_intro#GSQL_intro_embeddedsql

动态 SQL 信息: http ://docs.intersystems.com/ens20131/csp/documatic/%CSP.Documatic.cls?APP=1&LIBRARY=%SYS&CLASSNAME=%SQL.Statement

嵌入式 SQL 信息: http ://docs.intersystems.com/ens20131/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_esql

于 2013-09-12T17:15:21.337 回答
0

您可以在自己的命名空间中创建 %SQL.Shell 的重复类,并且可以对其进行编辑。如果您想要作为 Routine 意味着您可以从您的例程中调用此方法 ...%Go() 。

于 2013-09-13T08:46:57.107 回答