通过在调用例程内构建被调用的例程的名称,
动态的例程名称规范允许您从另一 SPL 例程
执行 SPL 例程。
动态的例程名称规范简化您编写调用另一 SPL 例程的 SPL 例程的方式,
直到运行时才能知道另一例程的名称。
数据库服务器允许您在 EXECUTE PROCEDURE 或
EXECUTE FUNCTION 语句中指定 SPL 变量,而不是 SPL 例程的显式的名称。
在下图中,SPL 过程 company_proc 更新大型的公司销售表,然后,分配名
为 salesperson_proc 的 SPL 变量来保存更新另一较小表的动态地创建的 SPL 过程的名
称,这个较小的表包含个别销售人员的每月销售情况。
图: 动态的例程名称规范。
CREATE PROCEDURE company_proc ( no_of_items INT,
itm_quantity SMALLINT, sale_amount MONEY,
customer VARCHAR(50), sales_person VARCHAR(30) )
DEFINE salesperson_proc VARCHAR(60);
-- 更新公司表
INSERT INTO company_tbl VALUES (no_of_items, itm_quantity,
sale_amount, customer, sales_person);
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 316 -
-- 生成变量 salesperson_proc 的过程名称
LET salesperson_proc = sales_person || "." || "tbl" ||
current_month || "_" || current_year || "_proc" ;
-- 执行 salesperson_proc 变量指定的
-- SPL 过程
EXECUTE PROCEDURE salesperson_proc (no_of_items,
itm_quantity, sale_amount, customer)
END PROCEDURE;
在示例中,
过程 company_proc 接受五个参数,
并将它们插入至 company_tbl 内。
然后,
LET
语句使用不同的值和连接运算符 || 来产生要执行的另一 SPL 过程的名称。在 LET 语句
中:
sales_person
传给 company_proc 过程的参数。
current_month
系统日期中的当前月份。
current_year
系统日期中的当前年份。
因此,如果名为 Bill 的销售人员在 1988 年 7 月完成一笔销售,
则 company_proc 在 company_tbl 中插入一记录,并执行 SPL 过程bill.tbl07_1998_proc,更
新包含个别销售人员的每月销售情况的较小的表。
动态例程名称规范的规则
您必须定义保存动态地执行的 SPL 例程的名称的 SPL 变量为 CHAR、VARCHAR、
NCHAR 或 NVARCHAR 类型。您还必须为 SPL 变量提供一个有效的且非 NULL 的名
称。
在可执行动态的例程名称规范标识的 SPL 例程之前,该例程必须存在。如果你将有效的
SPL 例程的名称分配给该 SPL 变量,则 EXECUTE PROCEDURE 或 EXECUTE
FUNCTION 语句执行在该变量中包含其名称的例程,即使存在同名的内建的函数。
在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句中,您不可使用两个 SPL 变
量来创建形式为 owner.routine_name 的变量名称。
然而,
您可使用包含完全限定的例程名称
的 SPL 变量,例如,bill.proc1。下图同时展示这两种情况。
图: 包含完全限定的例程名称的 SPL 变量。
EXECUTE PROCEDURE owner_variable.proc_variable;
-- 不允许这样
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 317 -
LET proc1 = bill.proc1;
EXECUTE PROCEDURE proc1; -- 允许这样