使用Intersystems Cache数据库存储过程的最快方式(在运行时)返回BLOB只能返回什么?

时间:2014-01-06 22:36:59

标签: intersystems-cache

这个问题专门针对Intersystems-Cache数据库。

我目前正在使用$$$ ResultSet(“MySQLQueryText”)从表中选择BLOB,但这可能是将BLOB写入表中,然后从表中读出,而不是直接写入输出BLOB。

.INT代码编译为创建%Library.ProcedureContext对象的代码,然后在该对象上调用NewResultSet()。但是,NewResultSet的源有一个注释:“仅在内部使用,不要直接调用”。

是否有一种受支持的方式来有效地创建一个只有单个BLOB列的单个记录的结果集?理想情况下,我喜欢像流对象这样的东西并直接写入,然后直接转到ODBC(或其他)驱动程序而不复制流。如果有一个支持的解决方案使用另一个不完全是一个非常好的流的对象。

1 个答案:

答案 0 :(得分:1)

@psr - 基于评论中的讨论,我相信您应该能够使用类似以下内容的代码:

/// Method that will take in various arguments and return a BLOB as an output argument
ClassMethod GetBLOB(
  arg1 As %String,
  arg2 As %String,
  ...
  Output blob As %Stream.TmpBinary) [ SqlProc ]
{
  // Do work to produce your BLOB
  Set blob = yourBLOB
  Quit
}

对BLOB的实际支持可能取决于您的客户端软件以及您使用的是ODBC还是JDBC,但是任何合理的最新版本都不应该造成任何问题。

您可以使用以下语法调用此存储过程:

CALL Your_Schema.YourClass_GetBLOB('arg1','arg2',?)

检索BLOB的实际方法将取决于您的客户端软件和访问方法。您还可以通过在SqlName = MyGetBLOB关键字旁边添加SqlProc来控制存储过程名称(即架构后面的部分)。