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 Web 服务 » 使用参数

 

参数替代

每次执行存储过程或存储函数时,将用该过程或函数的已声明参数自动替代过程或函数定义中的占位符。任何包含后面跟有已声明参数名称的感叹号 (!) 的子字符串都会被替换为该参数的值。

例如,以下过程定义允许将整个 URL 作为一个参数传递。每次调用此过程时可使用不同的值。

CREATE PROCEDURE test ( url CHAR(128) )
URL '!url'
TYPE 'HTTP:POST';

例如,接下来可以使用下面的过程:

CALL test ( 'HTTP://localhost/myservice' );
隐藏用户和口令值

参数替代的一个实用价值是避免将敏感值(如用户名和口令)作为 Web 服务客户端函数或过程定义的一部分。当此类值被指定为过程或函数定义中的文字时,它们将存储在系统表中,这样就使数据库的所有用户随时都可以访问它们。将这些值作为参数传递就避免了这一问题。

例如,以下过程定义将用户名和口令以纯文本形式包含在其中:

CREATE PROCEDURE test ()
URL 'HTTP://dba:sql@localhost/myservice';

为避免此问题,可以将用户名和口令声明为参数。这样就可以只在调用过程时才提供用户名和口令值。例如:

CREATE PROCEDURE test ( uid CHAR(128), pwd CHAR(128) )
URL 'HTTP://!uid:!pwd@localhost/myservice';

如下所示调用此过程:

CALL test ( 'dba', 'sql' );

作为另一个示例,可使用参数替代传递来自某文件的加密证书并将它们传递到存储过程或存储函数:

CREATE PROCEDURE secure( cert LONG VARCHAR )
URL 'https://localhost/secure'
TYPE 'HTTP:GET'
CERTIFICATE 'cert=!cert;company=test;unit=test;name=RSA Server';

调用此过程时,以字符串形式提供证书。在以下示例调用中,从某文件读取证书。这只是为了举例说明,因为可使用 CERTIFICATE 子句的 file= 关键字直接从文件读取证书。

CALL secure( xp_read_file('install-dir\bin32\rsaserver.id') );
! 字符转义

由于感叹号 (!) 用于标识 Web 服务客户端存储函数和存储过程上下文中要进行参数替代的占位符,因此,只要想在任何过程属性字符串中包含此字符,就必须对其进行转义。为此,要在感叹号前面加上另一个感叹号作为前缀。这样,Web 服务客户端或 Web 服务函数定义中的字符串内出现的所有 !! 都将替换为 !。

用作占位符的参数名必须只包含字母数字字符。此外,占位符后必须跟有一个非字母数字字符以避免多义性。没有匹配参数名的占位符将自动删除。例如,将不会用参数 size 替代以下过程中的占位符:

CREATE PROCEDURE orderitem ( size CHAR(18) )
URL 'HTTP://salesserver/order?size=!sizeXL'
TYPE 'SOAP:RPC';

但是,!sizeXL 会始终删除,因为它是一个没有匹配参数的有效占位符。