Declared parameters to the stored procedure or stored function are automatically substituted for placeholders within the stored function or stored procedure definition each time the procedure or function is executed. Any substrings that contain an exclamation mark (!) followed by the name of one of the declared parameters are replaced by that parameter's value.
For example, the following procedure definition permits the entire URL to be passed as a parameter. Different values can be used each time this procedure is called.
CREATE PROCEDURE test ( url CHAR(128) ) URL '!url' TYPE 'HTTP:POST';
For example, you could then use the procedure as follows:
CALL test ( 'HTTP://localhost/myservice' );
One useful application of parameter substitution is to avoid making sensitive values, such as user names and passwords, part of a web service client function or procedure definition. When such values are specified as literals in the procedure or function definition, they are stored in the system tables, making them readily accessible to all users of the database. Passing these values as parameters circumvents this problem.
For example, the following procedure definition includes the user name and password as plain text as part of the procedure definition:
CREATE PROCEDURE test URL 'HTTP://dba:sql@localhost/myservice';
To avoid this problem, you can declare user and password as parameters. Doing so permits the user and password values to be supplied only when the procedure is invoked. For example:
CREATE PROCEDURE test ( uid CHAR(128), pwd CHAR(128) ) URL 'HTTP://!uid:!pwd@localhost/myservice';
This procedure is called as follows:
CALL test ( 'dba', 'sql' );
As another example, you can use parameter substitution to pass encryption certificates from a file and pass them to a stored procedure or stored function:
CREATE PROCEDURE secure( cert LONG VARCHAR ) URL 'https://localhost/secure' TYPE 'HTTP:GET' CERTIFICATE 'cert=!cert;company=test;unit=test;name=RSA Server';
When you call this procedure, you supply the certificate as a string. In the following example call, the certificate is read from a file. This is done for illustration only, as the certificate can be read directly from a file using the file= keyword for the CERTIFICATE clause.
CALL secure( xp_read_file('install-dir\win32\rsaserver.crt') );
Because the exclamation mark (!) is used to identify placeholders for parameter substitution in the context of web service client stored functions and stored procedures, it must be escaped whenever you want to include this character as part of any of the procedure attribute strings string. To do so, prefix the exclamation mark with a second exclamation mark. Hence, all occurrences of !! in strings within a web service client or web service function definition are replaced by !.
Parameter names used as placeholders must contain only alphanumeric characters. In addition, placeholders must be followed by a non-alphanumeric character to avoid ambiguity. Placeholders with no matching parameter name are automatically deleted. For example, the parameter size would not be substituted for the placeholder in the following procedure:
CREATE PROCEDURE orderitem ( size CHAR(18) ) URL 'HTTP://salesserver/order?size=!sizeXL' TYPE 'SOAP:RPC'
Instead, !sizeXL is always deleted because it is a valid placeholder for which there is no matching parameter.