SELECT 语句中的 SPL 例程

本章前面的示例显示由列名、运算符和 SQL 函数组成的 SELECT 语句表达式。本章提供了包含 SPL 例程调用的表达式。

SPL 例程包含特定的存储过程语言(SPL)语句和 SQL 语句。有关 SPL 例程的更多信息,请参阅创建和使用 SPL 例程

GBase 8s 允许用 C 和 Java™ 编写外部例程。有关更多信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南

当您在投影列表中包含 SPL 例程表达式时,该 SPL 例程必须是返回单个值(一行一列)的例程。例如:仅当 test_func() 返回单个值时,以下语句才有效:
SELECT col_a, test_func(col_b) FROM tab1 
          WHERE col_c = "Davis";

当您在 SELECT 语句的 Projection 子句中包含 SPL 例程表达式时,该 SPL 例程必须是返回单个值(一行一列)的例程。例如:仅当 test_func() 返回单个值时,数据库服务器返回一个错误消息。returns more than one value, the database server returns an error message.

SPL 例程通过允许您对选择的每行执行子查询来扩展可用函数的范围。

例如,假设您现有客户号、客户的姓和客户已下订单数的列表。下列查询查询了检索此信息的一种方法。customer 表具有 customer_numlname 列,但没有每个客户已下订单数的记录。可以编写 get_orders 例程,该例程查询每个 customer_numorders 表并返回相应订单的数目(标记为 n_orders)。

图: 查询

SELECT customer_num, lname, get_orders(customer_num) n_orders
          FROM customer;
该结果显示了此 SPL 例程的输出。

图: 查询结果

customer_num    lname    n_orders
        
        101    Pauli           1
        102    Sadler          9
        103    Currie          9
        104    Higgins         4
        ⋮
        123    Hanlon          1
        124    Putnum          1
        125    Henry           0 
        126    Neelie          1
        127    Satifer         1
        128    Lessor          0
使用 SPL 例程来封装查询中经常执行的操作。例如:以下查询中的条件包括例程 conv_price,该例程将库存商品的单击转换为不同的货币并添加任何进口关税。

图: 查询

SELECT stock_num, manu_code, description FROM stock 
          WHERE conv_price(unit_price, ex_rate = 1.50, 
          tariff = 50.00) < 1000;