Collection Contents 上一页 下一页 PDF

ASA SQL 参考

SQL 语句

CREATE FUNCTION 语句


说明 

此语句用于在数据库中创建新函数。

语法 1 

CREATE FUNCTION [ owner.]function-name ( [ parameter, ... ] )
RETURNS data-type routine-characteristics
compound-statement
   | AS tsql-compound-statement
   | external-name }

语法 2 

CREATE FUNCTION [ owner.]procedure-name ( [ parameter, ... ] )
RETURNS data-type
URL url-string
TYPE { 'HTTP[:{GET|POST}]' | 'SOAP[:{RPC|DOC}]' } ]
NAMESPACE namespace-string ]
CERTIFICATE certificate-string ]
CLIENTPORT clientport-string ]
PROXY proxy-string ]

url-string :
'{HTTP|HTTPS}://[user:password@]hostname[:port][/path]'

parameter :
IN ] parameter-name data-type

routine-characteristics
ON EXCEPTION RESUME | [ NOT ] DETERMINISTIC

tsql-compound-statement:
sql-statement
sql-statement
 ...

external-name:
  EXTERNAL NAME library-call
EXTERNAL NAME java-call LANGUAGE JAVA

library-call :
'[operating-system:]function-name@library; ...'

operating-system :
Windows95 | WindowsNT | NetWare | UNIX

java-call :
'[package-name.]class-name.method-name method-signature'

method-signature :
([field-descriptor, ... ]) return-descriptor

field-descriptor | return-descriptor :
Z | B | S | I | J | F | D | C | V | [descriptor | Lclass-name;

参数 

CREATE FUNCTION 子句    参数名称必须遵守数据库标识符规则。它们必须是有效的 SQL 数据类型,而且必须有关键字 IN 作为前缀,以表明参数是为函数提供值的表达式。

compound-statement    一组用 BEGIN 和 END 括起来的 SQL 语句,中间用分号分隔。请参见 BEGIN 语句

tsql-compound-statement    Transact-SQL 批处理语句。请参见 Transact-SQL 批处理语句概述CREATE PROCEDURE 语句 [T-SQL]

EXTERNAL NAME 子句    使用 EXTERNAL NAME 子句的函数是包含外部库函数调用的包装。使用 EXTERNAL NAME 的函数在 RETURNS 子句后可以不使用其它子句。library 名可包含文件扩展名,在 Windows 中通常为 .dll、在 UNIX 中通常为 .so、在 NetWare 中通常为 .nlm。在没有扩展名的情况下,该软件附加平台特定的缺省库文件扩展名。在 NetWare 上,如果未指定 NLM 名称,则在调用函数时,必须已加载包含该符号的 NLM。

有关外部库调用的信息,请参见从过程调用外部库

EXTERNAL NAME LANGUAGE JAVA 子句    使用带 LANGUAGE JAVA 子句的 EXTERNAL NAME 的函数是包含 Java 方法的包装。

有关调用 Java 过程的信息,请参见 CREATE PROCEDURE 语句

ON EXCEPTION RESUME 子句    使用 Transact-SQL -like 错误处理。有关详细信息,请参见 CREATE PROCEDURE 语句

NOT DETERMINISTIC 子句    指定为 NOT DETERMINISTIC 的函数每次在查询中调用时都将重新求值。不是以这种方式指定的函数的结果可以高速缓存起来以便提高性能,并且每次在查询求值过程中使用相同的参数调用函数时,都会重用高速缓存的结果。

如果函数有副作用(比如修改基础数据),应将其声明为 NOT DETERMINISTIC。例如,一个生成主键值并用在 INSERT ... SELECT 语句中的函数应声明为 NOT DETERMINISTIC:

CREATE FUNCTION keygen( increment INTEGER )
RETURNS INTEGER
NOT DETERMINISTIC
BEGIN
  DECLARE keyval INTEGER;
  UPDATE counter SET x = x + increment;
  SELECT counter.x INTO keyval FROM counter;
  RETURN keyval
END
INSERT INTO new_table
SELECT keygen(1), ...
FROM old_table

如果函数对给定的输入参数总是返回相同的值,则可以将其声明为 DETERMINISTIC。在本软件的将来版本中,可能使用此声明来实现对同一输入可能返回不同值的函数的优化,而这些优化在目前可能是不安全的。

URL 子句    仅用于定义 HTTP 或 SOAP Web 服务客户端函数。指定 Web 服务的 URI。

TYPE 子句    用于指定创建 Web 服务请求时使用的格式。如果指定 SOAP 或未包括类型子句,则使用缺省类型 SOAP:RPC。HTTP 隐含 HTTP:POST。由于 SOAP 请求总是作为 XML 文档发送,因此总是使用 HTTP:POST 发送 SOAP 请求。

NAMESPACE 子句    仅适用于 SOAP 客户端函数。此子句标识 SOAP:RPC 和 SOAP:DOC 请求通常都需要的方法命名空间。处理请求的 SOAP 服务器使用此命名空间来解释 SOAP 请求消息主体中的实体的名称。可以从 Web 服务服务器中可用的 SOAP 服务的 WSDL 说明中获取命名空间。缺省值是过程的 URL,但是不包括可选的路径组件。

CERTIFICATE 子句    为了创建安全 (HTTPS) 请求,客户端必须能够访问 HTTPS 服务器所用的证书。必要的信息在一个用分号分隔的键/值对字符串中指定。可以将证书放置在一个文件中并使用 file 项提供的文件名,或是将整个证书放置在一个字符串中,但是两种方法不可同时使用。可以使用以下项:

缩写 说明
file 证书的文件名。
certificate cert 证书本身。
company co 证书中指定的公司。
unit 证书中指定的公司单位。
name 证书中指定的公用名。

只有发送到 HTTPS 服务器的请求或从非安全服务器重定向到安全服务器的请求才需要证书。除非在启动数据库服务器时使用了证书参数,否则将请求发送到接受 HTTPS 请求的 Adaptive Server Anywhere 数据库服务器时不需要证书值。

CLIENTPORT 子句    标识 HTTP 客户端过程进行 TCP/IP 通信的端口号。该子句是为通过防火墙的连接提供的,并建议只用于此类连接,因为防火墙按照 TCP/UDP 端口进行过滤。您可以指定单个端口号、端口号范围或是两者的组合(例如,CLIENTPORT '85,90-97')。

有关详细信息,请参见 ClientPort 协议选项 [CPORT]

PROXY 子句    指定代理服务器的 URI。在客户端必须通过代理访问网络时使用。指示过程连接着代理服务器并通过它将请求发送到 Web 服务。

用法 

CREATE FUNCTION 语句在数据库中创建用户定义的函数。通过指定所有者名称,可以为其他用户创建函数。根据权限,可以用与其它非集合函数的使用方法完全相同的方法使用用户定义的函数。

Adaptive Server Anywhere 将所有用户定义的函数视为等幂,除非将它们声明为 NOT DETERMINISTIC。等幂函数为相同的参数返回一致的结果,并且没有副作用。也即,服务器假定对同一函数连续进行两次参数相同的调用将返回相同的结果,并且不会对查询的语义产生任何不需要的副作用。

如果函数返回一个结果集,则它不能同时设置输出参数或返回一个返回值。

SOAP 和 HTTP 函数的返回类型必须是某种字符数据类型(比如 VARCHAR)。返回值是 HTTP 响应的主体。其中不包括 HTTP 标头信息。如果需要详细信息(比如状态信息),请使用过程代替函数。

参数值作为请求的一部分进行传递。使用的语法取决于请求的类型。对于 HTTP:GET,参数作为 URL 的一部分传递;对于 HTTP:POST 请求,则将值放在请求主体中。SOAP 请求的参数总是捆绑在请求主体中。

权限 

必须有 RESOURCE 权限。

外部函数(包括 Java 函数)必须有 DBA 权限。

副作用 

自动提交。

另请参见 
标准和兼容性 
示例 

下面的函数将 firstname 字符串和 lastname 字符串串联在一起。

CREATE FUNCTION fullname (
   firstname CHAR(30),
   lastname CHAR(30) )
RETURNS CHAR(61)
BEGIN
   DECLARE name CHAR(61);
   SET name = firstname || ' ' || lastname;
   RETURN (name);
END

下面的示例说明了 fullname 函数的使用。

从两个提供的字符串中返回完整的名称:

SELECT fullname ('joe','smith')
fullname('joe', 'smith')
joe smith

列出所有雇员的姓名:

SELECT fullname (emp_fname, emp_lname)
FROM employee
fullname (emp_fname, emp_lname)
Fran Whitney
Matthew Cobb
Philip Chin
Julie Jordan
...

以下函数使用 Transact-SQL 语法:

CREATE FUNCTION DoubleIt ( @Input INT )
RETURNS INT
AS
  DECLARE @Result INT
  SELECT @Result = @Input * 2
  RETURN @Result

语句 SELECT DoubleIt( 5 ) 的返回值为 10

以下语句创建一个用 Java 编写的外部函数:

CREATE FUNCTION dba.encrypt( IN name char(254) )
RETURNS VARCHAR
EXTERNAL NAME
  'Scramble.encrypt (Ljava/lang/String;)Ljava/lang/String;'
LANGUAGE JAVA

Collection Contents 上一页 下一页 PDF