Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (E-O)

 

MESSAGE 语句

此语句用于显示消息。

语法
MESSAGE expression, ...
[ TYPE { INFO | ACTION | WARNING | STATUS } ]
[ TO { CONSOLE 
   | CLIENT [ FOR { CONNECTION conn-id [ IMMEDIATE ] | ALL } ] 
   | [ EVENT | SYSTEM ] LOG }
   [ DEBUG ONLY ] ]
conn-id : integer
参数
  • TYPE 子句   此子句指定消息类型。可接受的值为 INFO、ACTION、WARNING 和 STATUS。客户端应用程序必须决定如何处理消息。例如,Interactive SQL 在以下位置显示消息:

    • INFO   [消息] 选项卡。INFO 为缺省类型。

    • ACTION   含 [确定] 按钮的窗口。

    • WARNING   含 [确定] 按钮的窗口。

    • STATUS   [消息] 选项卡。

  • TO 子句   该子句指定消息的目标:

    • CONSOLE   将消息发送到数据库服务器消息窗口,并在数据库服务器消息日志文件已指定的情况下将消息发送到该文件。CONSOLE 为缺省值。

    • CLIENT   将消息发送到客户端应用程序。您的应用程序必须决定如何处理消息,您可以将 TYPE 用作信息,并根据它作出该决定。

    • LOG   将消息发送到 -o 选项指定的服务器日志文件中。如果指定了 EVENT 或 SYSTEM,则还会将消息分别写入数据库服务器消息窗口、位于事件源 SQLANY 11.0 Admin 下面的 Windows 事件日志和位于名称 SQLANY 11.0 Admin(服务器名)下面的 Unix SysLog 中。服务器日志中的消息将按如下方式进行标识:

      • i   INFO 或 STATUS 类型的消息。

      • w   WARNING 类型的消息。

      • e   ACTION 类型的消息。

  • FOR 子句   对于消息 TO CLIENT,此子句指定哪个连接接收关于消息的通知。缺省情况下,连接将在下次执行 SQL 语句或 WAITFOR DELAY 语句时接收消息。

    • CONNECTION conn-id   指定接收者的连接 ID。如果指定 IMMEDIATE,则无论何时执行 SQL 语句,连接都会在几秒钟内接收消息。

    • ALL   指定所有打开的连接接收消息。

  • DEBUG ONLY   此子句允许您控制是否通过更改 debug_messages 选项的设置,来启用或禁用添加到存储过程和触发器中的调试消息。如果指定了 DEBUG ONLY,则只有在 debug_messages 选项设置为 On 时,才会执行 MESSAGE 语句。

    注意

    将 debug_messages 选项设置为 Off 时,DEBUG ONLY 消息并不占用大量资源,因此在生产系统中,通常可以将这些语句保留在存储过程中。不过,在可能会频繁执行这些语句的地方应慎用它们;否则,它们可能会导致性能略微降低。

注释

MESSAGE 语句显示消息,该消息可以是任何表达式。子句可以指定消息类型和显示消息的位置。

发出 MESSAGE ...TO CLIENT 语句的过程必须与连接相关联。

例如,下面的示例中不显示窗口,因为其事件发生在连接之外。

CREATE EVENT CheckIdleTime
TYPE ServerIdle
WHERE event_condition( 'IdleTime' ) > 100
HANDLER
BEGIN
   MESSAGE 'Idle engine' TYPE WARNING TO CLIENT;
END;

但是,在以下示例中,会将消息写入到数据库服务器消息窗口中。

CREATE EVENT CheckIdleTime
TYPE ServerIdle
WHERE event_condition( 'IdleTime' ) > 100
HANDLER
BEGIN
   MESSAGE 'Idle engine' TYPE WARNING TO CONSOLE;
END;

有效的表达式可以包括带引号的字符串或者其它常量、变量或函数。

FOR 子句可用于将数据库服务器上所检测到的事件通知其它应用程序,而不需要该应用程序显式地检查事件。使用 FOR 子句后,接收者在下次执行 SQL 语句时会接收到消息。如果接收者当前正在执行 SQL 语句,则将在该语句完成后接收到消息。如果正在执行的语句是存储过程调用,则将在调用完成前收到消息。

如果应用程序需要在消息发出不久和连接不执行 SQL 语句时得到通知,则应使用 IMMEDIATE 子句实现客户端通知,而不使用多个并发的 WAITFOR DELAY 语句。

通常情况下,使用 IMMEDIATE 子句发送的消息将在 5 秒内传送出去,即使在目标连接未发出数据库服务器请求时也是如此。如果客户端连接每秒发出多次请求,或收到庞大的 BLOB 数据,或者客户端消息回调的执行时间超过 1 秒,均可能会造成消息传送延迟。此外,在两秒内将多个 IMMEDIATE 消息发送给同一连接也可能会延迟消息传送或生成错误消息。如果客户端连接已断开,则可能无法传送成功的 MESSAGE ...IMMEDIATE 语句。

对于未使用 IMMEDIATE 子句发送的消息,只有在客户端执行某个特定请求或执行 WAITFOR DELAY 语句时才会传送它们。因此,消息的传送时间没有限制。

IMMEDIATE 子句需要 SQL Anywhere 11.0.1 版或较新的 DBLib、ODBC 或 iAnywhere JDBC 客户端库。非线程 Unix 客户端库不支持 IMMEDIATE 子句。当消息被发送到不支持 IMMEDIATE 子句的目标连接时,会生成错误消息。

MESSAGE ...TO CLIENT 表达式可以截断为 2048 个字节。对于使用 IMMEDIATE 子句发送的消息,消息表达式可以被截断为小于连接的包大小或 2048 个字节。

嵌入式 SQL 和 ODBC 客户端通过消息回调函数接收消息。在每种情况下,都必须注册这些函数。在嵌入式 SQL 中,使用 DB_CALLBACK_MESSAGE 参数向 db_register_a_callback 注册消息回调。在 ODBC 中,使用 ASA_REGISTER_MESSAGE_CALLBACK 参数向 SQLSetConnectAttr 注册消息回调。

权限

执行包含 FOR 子句、TO EVENT LOG 子句或 TO SYSTEM LOG 子句的 MESSAGE 语句需要具有 DBA 权限。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

以下过程在数据库服务器消息窗口中显示消息:

CREATE PROCEDURE message_text()
BEGIN
MESSAGE 'The current date and time: ', Now();
END;

以下语句在数据库服务器消息窗口中显示后面跟有当前日期和时间的 The current date and time 字符串。

CALL message_text();