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 Anywhere 数据访问 API » SQL Anywhere 外部环境支持

 

外部环境概述

SQL Anywhere 支持六种外部运行时环境。它们包括以 C/C++ 编写的嵌入式 SQL 和 ODBC 应用程序,以及以 Java、Perl、PHP 或 C# 和 Visual Basic 等基于 Microsoft .NET Framework 公共语言运行库 (CLR) 的语言编写的应用程序。

SQL Anywhere 支持调用以 C 或 C++ 语言编写的编译后本地函数已有一段时间了。但是,如果这些过程由数据库服务器运行,动态链接库或共享对象始终由数据库服务器装载,本地函数也始终由数据库服务器调用。这样做的风险是,如果本地函数导致故障,则会使数据库服务器崩溃。所以,在数据库服务器的外部(即在外部环境中)运行已编译的本地函数,可以消除服务器的这些风险。

以下是对 SQL Anywhere 在外部环境支持方面的概述。

目录表

一个系统目录表用来存储标识和启动每个外部环境所需的信息。此表的定义如下:

SYS.SYSEXTERNENV (
  object_id            unsigned bigint not null,
  name                 varchar(128)    not null,
  scope                char(1)         not null,
  supports_result_sets char(1)         not null,
  location             long varchar    not null,
  options              long varchar    not null,
  user_id              unsigned int
)
  • object_id   由数据库服务器生成的唯一标识符。

  • name   name 列标识外部环境或语言的名称。即 javaperlphpclrc_esql32c_esql64c_odbc32c_odbc64

  • scope   scope 列为 CD,分别代表 CONNECTION(连接)或 DATABASE(数据库)。scope 列用来标识外部环境是与连接一一对应还是与数据库一一对应。

    对于与连接一一对应的外部环境(如 PERL、PHP、C_ESQL32、C_ESQL64、C_ODBC32 和 C_ODBC64),针对使用外部环境的每个连接会有一个外部环境实例。如果是与连接一一对应,则连接终止时外部环境即终止。

    对于与数据库一一对应的外部环境(如 JAVA 和 CLR),针对使用外部环境的每个数据库会有一个外部环境实例。如果是与数据库一一对应,则数据库停止时外部环境即终止。

  • supports_result_sets   supports_result_sets 列标识那些可以返回结果集的外部环境。除了 PERL 和 PHP,所有外部环境都可以返回结果集。

  • location   location 列标识数据库服务器计算机上可以找到外部环境可执行文件/二进制文件的位置。它包括可执行文件名/二进制文件名。此路径可以是完全限定路径,也可以是相对路径。如果是相对路径,则可执行文件/二进制文件必须位于数据库服务器可以找到的位置。

  • options   options 列标识命令行上启动与外部环境相关联的可执行文件所需的任何选项。您不能修改此列。

  • user_id   user_id 列标识数据库中具有 DBA 权限的用户 ID。最初启动外部环境时,必须建立返回到数据库的连接,以为外部环境的使用做好准备。缺省情况下,此连接会使用该 DBA 用户 ID 建立,但如果数据库管理员倾向于让外部环境使用另一个具有 DBA 权限的用户 ID,就会转而由 SYS.SYSEXTERNENV 表中的 user_id 列指示该不同的用户 ID。然而大多数情况下,SYS.SYSEXTERNENV 中的此列为 NULL,数据库服务器会缺省使用这里的 DBA 用户 ID。

另一个系统目录表用来存储非 Java 外部对象。此表的表定义如下:

SYS.SYSEXTERNENVOBJECT (
  object_id    unsigned bigint not null,
  extenv_id    unsigned bigint not null,
  owner        unsigned int    not null,
  name         long varchar    not null,
  contents     long binary     not null,
  update_time  timestamp       not null
)
  • object_id   由数据库服务器生成的唯一标识符。

  • extenv_id    extenv_id 标识外部环境类型(如 SYS.SYSEXTERNENV 中所存储的)。

  • owner   owner 列标识外部对象的创建者/所有者。

  • name   name 列是 INSTALL EXTERNAL OBJECT 语句中所指定的外部对象的名称。

  • contents   contents 列包含外部对象的内容。

  • update_time   update_time 列代表上次修改(或安装)对象的时间。

不再支持的选项

随着 SYS.SYSEXTERNENV 表的引入,现在已不再支持某些特定于 Java 的选项。不再支持的选项有:

java_location
java_main_userid

对于之前一直使用这些选项来标识使用哪个具体 Java VM 或使用哪个用户 ID 安装类及执行其它 Java 相关管理任务的应用程序,应转而使用 ALTER EXTERNAL ENVIRONMENT 语句,来在 SYS.SYSEXTERNENV 表中针对 Java 设置位置和 user_id 值。

SQL 语句

以下 SQL 语法用于设置或修改 SYS.SYSEXTERNENV 表中的值。

ALTER EXTERNAL ENVIRONMENT environment-name 
    [ USER user-name ]
    [ LOCATION location-string ]
  • environment-name   环境名是 SYS.SYSEXTERNENV 中代表环境名称的标识符,可以是 PERL、PHP、JAVA、CLR、C_ESQL32、C_ESQL64、C_ODBC32 或 C_ODBC64。

  • user-name   用户名字符串标识数据库中具有 DBA 权限的用户。最初启动外部环境时,必须建立返回到数据库的连接,以为外部环境的使用做好准备。缺省情况下,此连接会使用该 DBA 用户 ID 建立,但如果数据库管理员倾向于让外部环境使用另一个具有 DBA 权限的用户 ID,则 user-name 会指示将使用的不同用户 ID。大多数情况下,不需要指定此选项。

  • location-string   位置字符串标识数据库服务器计算机上可以找到外部环境可执行文件/二进制文件的位置。它包括可执行文件名/二进制文件名。此路径可以是完全限定路径,也可以是相对路径。如果是相对路径,则可执行文件/二进制文件必须位于数据库服务器可以找到的位置。

某个外部环境被设置为在数据库服务器上使用后,即可以在数据库中安装对象并在外部环境内创建使用这些对象的存储过程和函数。这些对象、存储过程和存储函数的安装、创建与使用与当前安装 Java 类和创建及使用 Java 存储过程和函数的方法非常类似。

要添加针对外部环境的注释,可以执行以下语句:

COMMENT ON EXTERNAL ENVIRONMENT environment-name
  IS comment-string

要从文件或表达式将外部对象(例如 Perl 脚本)安装到数据库中,需要执行如下的 INSTALL EXTERNAL OBJECT 语句:

INSTALL EXTERNAL OBJECT object-name-string
  [ update-mode ] 
  FROM { FILE file-path | VALUE expression }
  ENVIRONMENT environment-name 
  • object-name-string   对象名字符串是数据库中用来标识安装的对象的名称。

  • update-mode   更新模式为 NEW 或 UPDATE。如果忽略更新模式,则使用 NEW。

  • file-path   文件路径是数据库服务器计算机上从中安装对象的位置。

  • environment-name   环境名为 JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32 或 C_ODBC64。

要添加针对所安装外部对象的注释,可以执行以下语句:

COMMENT ON EXTERNAL ENVIRONMENT OBJECT object-name-string 
  IS comment-string

要从数据库中删除所安装的外部对象,需要使用 REMOVE EXTERNAL OBJECT 语句:

REMOVE EXTERNAL OBJECT object-name-string
  • object-name-string   对象名字符串与在相应 INSTALL EXTERNAL OBJECT 语句中指定的字符串为同一字符串。

外部对象安装在数据库中后,即可在外部存储过程和函数定义中使用(类似于当前创建 Java 存储过程和函数的机制)。

CREATE PROCEDURE procedure-name(...)
  EXTERNAL NAME '...' 
  LANGUAGE environment-name
CREATE FUNCTION function-name(...)
  RETURNS ... 
  EXTERNAL NAME '...'
  LANGUAGE environment-name
  • environment-name   环境名为 JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32 或 C_ODBC64。

这些存储过程和函数创建后,即可像数据库中任何其它存储过程或函数一样使用。遇到外部环境存储过程或函数时,数据库服务器会自动启动外部环境(如果尚未启动),并发送获取外部环境所需的一切信息,以便从数据库读取外部对象并执行。根据需要,会返回执行后产生的任何结果集或返回值。

如果要根据要求启动或停止外部环境,可以使用 START EXTERNAL ENVIRONMENT 和 STOP EXTERNAL ENVIRONMENT 语句(类似于当前的 START JAVA 和 STOP JAVA 语句):

START EXTERNAL ENVIRONMENT environment-name
STOP EXTERNAL ENVIRONMENT environment-name
  • environment-name   环境名为 JAVA、PERL、PHP、CLR、C_ESQL32、C_ESQL64、C_ODBC32 或 C_ODBC64。

有关详细信息,请参见: