characteristics
可用的关键字如下:
-
FOR className
- 指定要在其中创建方法的类的名称。 如果这个类不存在,它将被创建。 还可以通过限定方法名来指定类名。FOR
子句中指定的类名通过限定方法名重写指定的类名。 -
FINAL
- 指定子类不能重写该方法。 默认情况下,方法不是final
。FINAL
关键字由子类继承。 -
PRIVATE
- 指定该方法只能由它自己的类或子类的其他方法调用。 默认情况下,方法是公共的,可以不受限制地调用。 这个限制由子类继承。 -
PROCEDURE
- 指定该方法是一个SQL
存储过程。 存储过程由子类继承。 (这个关键字可以缩写为PROC
。) -
RESULT SETS
,DYNAMIC RESULT SETS [n]
- 指定创建的方法将包含ReturnResultsets
关键字。 这一特征短语的所有形式都是同义词。 -
RETURNS datatype
- 指定调用该方法返回的值的数据类型。 如果省略RETURNS
,则该方法不能返回值。 这个规范由子类继承,并且可以由子类修改。 该数据类型可以指定类型参数,如MINVAL
、MAXVAL
和SCALE
。 例如RETURNS DECIMAL(19,4)
。 注意,当返回一个值时, IRIS会忽略数据类型的长度; 例如,RETURNS VARCHAR(32)
可以接收由调用方法返回的任意长度的字符串。 -
SELECTMODE mode
- 仅当LANGUAGE
为SQL
(默认)时使用。 当指定时, IRIS将#SQLCOMPILE SELECT=mode
语句添加到相应的类方法中,从而生成使用指定的SELECTMODE
在方法中定义的SQL
语句。 可能的模式值是LOGICAL
、ODBC
、RUNTIME
和DISPLAY
。 默认为LOGICAL
。
如果指定对方法无效的查询关键字(如CONTAINSID
或RESULTS
),系统将生成SQLCODE -47
错误。
如果指定了重复的查询关键字(例如FINAL FINAL
),系统将生成SQLCODE -44
错误。
SELECTMODE
子句用于SELECT
查询操作以及INSERT
和UPDATE
操作。
它指定编译时选择模式。
为SELECTMODE
指定的值添加在ObjectScript类方法代码的开头,如:#SQLCompile Select=mode
。
- 在
SELECT
查询中,SELECTMODE
指定返回数据的模式。 如果模式值为LOGICAL
,则返回逻辑(内部存储)值。 例如,日期以$HOROLOG
格式返回。 如果模式值为ODBC
,则应用逻辑到ODBC
的转换,并返回ODBC
格式值。 如果模式值为DISPLAY
,则应用逻辑到显示的转换,并返回显示格式值。 如果mode
值为RUNTIME
,则可以在执行时设置显示模式(LOGICAL
、ODBC
或display
)。 - 在
INSERT
或UPDATE
操作中,SELECTMODE RUNTIME
选项支持将输入数据值从显示格式(display
或ODBC
)自动转换为逻辑存储格式。 只有当SQL
代码执行时的选择模式设置为LOGICAL
(这是所有SQL
执行接口的默认设置)时,才会应用这个已编译的从显示到逻辑的数据转换代码。
执行SQL
代码时,%SQL.Statement
类%SelectMode
属性指定执行时选择模式。
LANGUAGE
指定CODE_BODY
使用的语言的关键字子句。允许的子句是Language OBJECTSCRIPT
(对于ObjectScript)或Language SQL
。如果省略LANGUAGE
子句,则默认为SQL
。
code_body
要创建的方法的程序代码。可以在SQL
或ObjectScript中指定此代码。使用的语言必须与LANGUAGE
子句匹配。但是,在ObjectScript中指定的代码可以包含嵌入式SQL
。
IRIS使用提供的代码来生成该方法的实际代码。
如果指定的代码是SQL
, IRIS会在生成将SQL
嵌入到ObjectScript“包装器wrapper
”中的方法时提供额外的代码行,提供过程上下文处理程序(如有必要),并处理返回值。以下是此IRIS
生成的包装代码的示例:
NEW SQLCODE,%ROWID,%ROWCOUNT,title
&sql( SELECT col FROM tbl )
QUIT $GET(title)
如果指定的代码是OBJECTSCRIPT
,则必须用大括号将ObjectScript
代码括起来。除标签和宏预处理器指令外,所有代码行都必须从第1列缩进。标签或宏指令必须在第1列中以冒号(:
)开头。
对于ObjectScript
代码,必须显式定义“包装器”(该NEWs
变量并使用QUIT
退出,并(可选地)在完成时返回一个值)。
通过指定PROCEDURE
关键字,可以将该方法公开为存储过程。调用存储过程时,%Library.SQLProcContext
类的对象在%sqlcontext
变量中实例化。此过程上下文处理程序用于在过程及其调用方(例如,ODBC
服务器)之间来回传递过程上下文。
%sqlcontext
由几个属性组成,包括错误对象、SQLCODE
错误状态、SQL
行数和错误消息。下面的示例显示了用于设置其中几个值的值:
SET %sqlcontext.%SQLCODE=SQLCODE
SET %sqlcontext.%ROWCOUNT=%ROWCOUNT
SET %sqlcontext.%Message=%msg
SQLCODE
和%ROWCOUNT
的值由SQL
语句的执行自动设置。每次执行前都会重置%sqlcontext
对象。
或者,可以通过实例化%SYSTEM.Error
对象并将其设置为%sqlcontext.Error
来建立错误上下文。
示例
下面的示例使用带有SQL
代码的Create
方法在Sample.Employee
类中生成UpdateSalary
方法:
CREATE METHOD UpdateSalary ( IN SSN VARCHAR(11), IN Salary INTEGER )
FOR Sample.Employee
BEGIN
UPDATE Sample.Employee SET Salary = :Salary WHERE SSN = :SSN;
END
注意给表添加关键字[ DdlAllowed ]
下面的示例创建存储为生成随机大写字母的过程的RandomLetter()
方法。然后,可以在SELECT
语句中将此方法作为函数调用。提供了一个Drop
方法来删除RandomLetter()
方法。
CREATE METHOD RandomLetter()
RETURNS INTEGER
PROCEDURE
LANGUAGE OBJECTSCRIPT
{
:Top
SET x=$RANDOM(91)
IF x<65 {GOTO Top}
ELSE {QUIT $CHAR(x)}
}
代码语言:javascript复制Class User.methRandomLetter Extends %Library.RegisteredObject [ ClassType = "", DdlAllowed, Owner = {yx}, Not ProcedureBlock ]
{
ClassMethod RandomLetter() As %Library.Integer(MAXVAL=2147483647,MINVAL=-2147483648) [ SqlName = RandomLetter, SqlProc ]
{
Top
SET x=$RANDOM(91)
IF x<65 {GOTO Top}
ELSE {QUIT $CHAR(x)}
}
}
代码语言:javascript复制SELECT Name FROM Sample.Person
WHERE Name %STARTSWITH RandomLetter()
代码语言:javascript复制DROP METHOD RandomLetter
下面的嵌入式SQL示例使用带有ObjectScript代码的Create
方法在SQLUser.MyStudents
类中生成方法TraineeTitle
,并返回一个Title
值:
ClassMethod CreateMethod()
{
&sql(
CREATE METHOD TraineeTitle
(
IN SSN VARCHAR(11),
INOUT Title VARCHAR(50)
)
RETURNS VARCHAR(30)
FOR SQLUser.MyStudents
LANGUAGE OBJECTSCRIPT
{
n SQLCODE,%ROWCOUNT
&sql(
SELECT Title INTO :Title FROM Sample.Employee
WHERE SSN = :SSN
)
if $g(%sqlcontext)'= "" {
s %sqlcontext.%SQLCODE=SQLCODE
s %sqlcontext.%ROWCOUNT=%ROWCOUNT
}
q
}
)
if SQLCODE=0 {
w !,"创建方法" QUIT
} elseif SQLCODE=-361 {
w !,"方法已存在SQLCODE: ",SQLCODE
&sql(
DROP METHOD TraineeTitle FROM SQLUser.MyStudents
)
if SQLCODE=0 {
w !,"删除方法" QUIT
}
} else {
w !,"SQL error: ",SQLCODE
}
}
它使用%sqlcontext
对象,并使用相应的SQL
变量设置它的%SQLCODE
和%ROWCOUNT
属性。
请注意,在方法的LANGUAGE ObjectScript
关键字后面,用花括号括住ObjectScript
代码。
在ObjectScript
代码中有嵌入式SQL代码,用&sql
标记,用括号括起来。