# 第102章 SQL函数 %OBJECT 标量函数,它打开一个流对象并返回相应的 `oref`。 # 大纲 ``` %OBJECT(stream) ``` # 参数 - `stream` - 作为流字段名称的表达式。 # 描述 `%OBJECT` 用于打开一个流对象并返回流字段的 `oref`(对象引用)。 流字段上的 `SELECT` 返回流字段的完全形成的 `oid`(对象 ID)值。流字段上的 `SELECT %OBJECT` 返回流字段的 `oref`(对象引用)。这在以下示例中显示,其中 `Notes` 和 `Picture` 都是流字段: ```java /// d ##class(PHA.TEST.SQLFunction).Object() ClassMethod Object() { s myquery = "SELECT TOP 3 Title,Notes,%OBJECT(Picture) AS Photo FROM Sample.Employee" s tStatement = ##class(%SQL.Statement).%New() s qStatus = tStatement.%Prepare(myquery) s rset = tStatement.%Execute() while rset.%Next() { w "String field: ",rset.Title,! w "Stream field oid: ",rset.Notes,! w "Stream field oref: ",rset.Photo,!! } w !,"End of data" } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLFunction).Object() String field: test Stream field oid: Stream field oref: String field: Assistant Systems Engineer Stream field oid: Stream field oref: String field: Systems Engineer Stream field oid: Stream field oref: End of data ``` 如果 `stream` 不是流字段,则 `%OBJECT` 生成 `SQLCODE -128` 错误。 `%OBJECT` 可用作以下函数的参数: ```java CHARACTER_LENGTH(%OBJECT(streamfield)), CHAR_LENGTH(%OBJECT(streamfield)), or DATALENGTH(%OBJECT(streamfield)). ``` ```java SUBSTRING(%OBJECT(streamfield),start,length). ``` 可以通过在流字段上发出 SELECT 来执行相同的操作,然后通过调用 `$Stream.Object.%Open()` 类方法打开流 `oid`,该方法从 `oid` 生成一个 `oref`: ```java SET oref = ##class(%Stream.Object).%Open(oid) ```