本节提供了一些具有外部调用的过程和函数的示例。
要创建引用外部库的过程或函数,您必须具有 DBA 权限。这一要求比创建其它过程或函数所需的 RESOURCE 权限更为严格。
可以创建一个调用库(动态链接库(Dynamic Link Library,简称 DLL)或共享对象)中的 C/C++ 函数的 SQL 存储过程,如下所示:
CREATE PROCEDURE coverProc( parameter-list ) EXTERNAL NAME 'myFunction@myLibrary' LANGUAGE C_ESQL32; |
以这种方式定义存储过程或函数时,将创建一个连接到外部 DLL 中函数的桥。该存储过程或函数不能执行任何其它任务。
同样,还可以创建一个调用库中的 C/C++ 函数的 SQL 存储函数,如下所示:
CREATE FUNCTION coverFunc( parameter-list ) RETURNS data-type EXTERNAL NAME 'myFunction@myLibrary' LANGUAGE C_ESQL32; |
在这些语句中,EXTERNAL NAME 子句指示函数名及函数所在的库。在此示例中,myFunction
是库中函数的导出名称;myLibrary
是库的名称(例如,myLibrary.dll 或 myLibrary.so)。
LANGUAGE 子句指示将在外部环境中调用函数。LANGUAGE 子句可以指定 C_ESQL32、C_ESQL64、C_ODBC32 或 C_ODBC64 之一。后缀 32 或 64 指示函数将被编译为 32 位或 64 位应用程序。ODBC 标志指示应用程序使用 ODBC API。ESQL 标志指示应用程序可能使用嵌入式 SQL API、SQL Anywhere C API、任何其它非 ODBC API,或者根本不使用 API。
如果忽略 LANGUAGE 子句,则包含此函数的库将被装载到数据库服务器的地址空间中。调用时,外部函数将作为服务器的一部分执行。在这种情况下,如果此函数导致故障,则会使数据库服务器终止。因此,建议在外部环境中装载和执行函数。如果函数在外部环境中导致故障,数据库服务器仍可继续运行。
parameter-list 中的参数必须在类型和顺序上与库函数所需的参数相符。库函数使用在外部函数原型中介绍的 API 来访问过程参数。
外部函数所返回的任何值或结果集都可以由存储过程或函数返回给调用环境。
引用外部函数的存储过程或函数不可以包括任何其它语句:其唯一目的在于获取函数的参数、调用函数,并将任何值和从函数所返回的参数返回到调用环境。您可以采用与其它过程相同的方式在过程调用中使用 IN、INOUT 或 OUT 参数:将输入值传递给外部函数,由函数所修改的任何参数都将在 OUT 或 INOUT 参数中或者作为存储函数的 RETURNS 结果返回给调用环境。
可以指定与操作系统相关的调用,使过程在一个操作系统上运行时调用一个函数,在另一个操作系统上运行时调用另一个函数(大概类似)。此类调用的语法需要将操作系统名称作为函数名称的前缀。操作系统标识符必须是 Unix。下面是一个示例。
CREATE FUNCTION func ( parameter-list ) RETURNS data-type EXTERNAL NAME 'Unix:function-name@library.so;function-name@library.dll'; |
如果函数列表不包含运行服务器所在的操作系统的条目,但该列表确实包含未指定操作系统的条目,则数据库服务器调用该条目中的函数。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |