南大通用GBase8s 常用SQL语句(六十)

南大通用GBase8s 常用SQL语句(六十)
使用 SPECIFIC 子句来指定特定名称
可以为用户定义的过程声明一个在数据库中唯一的特定名称。特定名称当您重载过程时有用。
DOCUMENT 子句
DOCUMENT 子句中带引号的字符串提供对 UDR 的摘要和描述。该字符串存储在 sysprocbody 系统目录表中,适用于 UDR 的用户。
拥有对数据库访问权限的任何人均可查询 sysprocbody 系统目录表,以获取对存储在数据库中的一个或全部 UDR 描述。
例如,以下查询获取对 SPL 函数 所显示的 SPL 过程 raise_prices 的描述:
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid
–join between the two catalog tables
AND p.procname = ‘raise_prices’
– look for procedure named raise_prices
AND b.datakey = ‘D’;-- want user document
先前的查询返回以下文本:
USAGE: EXECUTE PROCEDURE raise_prices( xxx )
xxx = percentage from 1 - 100
对于外部过程,无论您是否使用 END PROCEDURE 关键字,均可以在 CREATE PROCEDURE 语句末尾包含 DOCUMENT 子句。
使用 WITH LISTING IN 选项
WITH LISTING IN 子句指示编译时发送警告的文件名。编译 UDR 之后,此文件包含一条或多条警告消息。该列表文件创建于数据库驻留的计算机上。
如果您不使用 WITH LISTING IN 子句,则编译器不生成警告列表。
在 UNIX™ 上,如果您指定文件名而非目录,将在数据库驻留的计算机上的主目录中创建此列表文件。如果您在此计算机上没有主目录,则在根目录中(名为 “/” 的目录)创建此文件。
在 Windows™ 上,如果果您指定文件名而非目录,则在数据库位于本地计算机的情况下,在当前工作目录中创建此列表文件。否则,缺省目录为 %GBASEDBTDIR%\bin 。
SPL 函数
SPL函数是用存储过程语言(SPL)编写的 UDR ,且不会返回一个值。要编写并注册 SPL 例程,请使用 CREATE PROCEDURE 语句。在 CREATE PROCEDURE 和 END PROCEDURE 关键字之间嵌入适当的 SQL 和 SPL 语句。还可以将 DOCUMENT 和 WITH FILE IN 选项放在该函数后面。
分析 SPL 例程,(尽可能)优化例程,并以可执行文件的形式存储在系统目录表中。SPL 函数的主题存储在 sysprocbody 系统目录表中。关于函数的其他信息存储在其它系统目录表中,包括 sysprocedures 、sysprocplan 和 sysprocauth 。
如果 CREATE PROCEDURE 语句的 Statement Block 部分为空,则当调用函数时,没有操作发生。当您试图建立未编码的过程,可能在开发阶段使用如“虚拟”过程。
如果在参数列表后面指定了可选子句,则您必须在此子句之后紧邻 Statement Block 之前加上分号。
以下示例创建了 SPL 函数:
CREATE PROCEDURE raise_prices ( per_cent INT )
UPDATE stock SET unit_price =
unit_price + (unit_price * (per_cent/100));
END PROCEDURE
DOCUMENT “USAGE: EXECUTE PROCEDURE raise_prices( xxx )”,
"xxx = percentage from 1 - 100 "
WITH LISTING IN ‘/tmp/warn_file’;
外部过程
外部过程是用数据库服务器支持的外部语言写的过程。(使用 SPL 语言编写的过程不是外部过程。)
要创建 C 的用户定义的过程:
1.编写不返回值的 C 函数。
2.编译 C 函数并将编译过的代码存储在共享库中(C 的共享对象文件)。
3.在数据库服务器中使用 CREATE PROCEDURE 语句注册 C 函数。
要创建以 Java™ 语言编写的用户定义的过程:
1.写一个 Java 静态方法,它能使用 JDBC 函数与数据库服务器交互。
2.编译 Java 源并创建一个 JAR 文件(共享对象文件)。
3.用 EXECUTE PROCEDURE 语句执行 install_jar( ) 过程,在当前数据库中安装 JAR 文件。
4.如果 UDR 使用用户定义类型,则使用在 EXECUTE PROCEDURE 语句 中说明的 setUDTextName( ) 过程在 SQL 数据类型和 Java 类别之间创建映射。
5.使用 CREATE PROCEDURE 语句注册 UDR 。(如果外部例程返回一个值,则您必须使用 CREATE FUNCTION 语句而非 CREATE PROCEDURE 来注册它。)
并非将外部例程的主体直接存储在数据库中,数据库服务器仅存储包含已编译版本例程的共享对象文件的路径名。数据库服务器通过调用外部目标代码执行外部例程。
您还必须持有要注册的外部过程所在数据库的 Resource 特权或 DBA 特权,和对编写的例程所有的程序语言的 Usage 特权。(有关在 C 语言或 Java 语言上将 Usage 特权授予用户或角色或 PUBLIC 组的语法的信息,请参阅 语言级权限。)
当 IFX_EXTEND_ROLE 配置参数设置成 1 或 ON 时,只有拥有内置 EXTEND 角色的用户才可以创建外部过程。
注册用户定义的过程
此示例注册了一个取得类型 LVARCHAR 的一个自变量的名为 check_owner( ) 的 C 用户定义的过程。外部例程参考指定了到存储目标代码的 C 共享库的路径。此库包含一个 C 函数 unix_owner( ) ,它在 check_owner( ) 过程执行期间被调用。
CREATE PROCEDURE check_owner ( owner lvarchar )
EXTERNAL NAME “/usr/lib/ext_lib/genlib.so(unix_owner)”
LANGUAGE C
END PROCEDURE;
此示例注册了一个以 Java™ 语言编写的名为 showusers( ) 的用户定义过程:
CREATE PROCEDURE showusers()
WITH (CLASS = “jvp”) EXTERNAL NAME ‘admin_jar:admin.showusers’ LANGUAGE JAVA;
EXTERNAL NAME 子句指定了 showusers( ) 过程的 Java 实现是名为 showusers( ) 的方法,它驻留在驻留于admin_jar JAR 文件的 admin Java 类中。
创建数据库对象的所有权
创建所有者特权 UDR 的用户拥有 UDR 执行时它所创建的任何数据库对象,除非已经为该对象指定了某个其他的所有者。换句话说,UDR 所有者,而非执行拥有所有者特权的 UDR 用户,是 UDR 创建的任何数据库对象的所有者,除非在创建数据库对象的 DDL 语句中指定了另一个所有者。
然而在拥有 DBA 特权的 UDR 情况下,执行 UDR 的用户,而非 UDR 所有者,拥有 UDR 创建的任何数据库对象,除非在 UDR 中为数据库对象指定某个其他的所有者。
有关示例,请参阅已创建数据库对象的所有权的 CREATE FUNCTION 语句的描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值