返回首页

gbase数据、南大通用产品文档:GBase8cDO

更新日期:2024年09月11日

功能描述
执行匿名代码块。
代码块被看做是没有参数的一段函数体,
返回值类型是void。
它的解析和执行是同一时
刻发生的。
注意事项
程序语言在使用之前,必须通过命令CREATE LANGUAGE 安装到当前的数据库中。
plpgsql 是默认的安装语言,其它语言安装时必须指定。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1102
如果语言是不受信任的,
用户必须有使用程序语言的USAGE 权限,
或者是系统管理员。
语法格式
DO [ LANGUAGE lang_name ] code;
参数说明

lang_name
用来解析代码的程序语言的名称,如果缺省,默认的语言是plpgsql。

code
程序语言代码可以被执行的。程序语言必须指定为字符串才行。
示例
--创建用户webuser。
gbase=#CREATE USER webuser PASSWORD 'xxxxxxxxx';
--授予用户webuser 对模式tpcds 下视图的所有操作权限。
gbase=#DO $$DECLARE r record;
BEGIN
FOR r IN SELECT c.relname table_name,n.nspname table_schema FROM pg_class
c,pg_namespace n
WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v')
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' ||
quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;
--删除用户webuser。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1103
gbase=#DROP USER webuser CASCADE;

使GBaseConnection 执行CommandText 属性指定的SQL 语句,并用返回值
构建GBaseDataReader。

语法
[Visual Basic]
Public Function ExecuteReader As GBaseDataReader
[C#]
public GBaseDataReader ExecuteReader();

返回值
一个GBaseDataReader 对象。

注释
当CommandType 属性是StoredProcedure,
CommandText 属性应该设置为存
储过程的名字。在用户调用Execute 方法的时候,命令执行这个存储过程。否



GBase 8a 程序员手册ADO.NET 篇
南大通用数据技术股份有限公司

- 141 -
则,在用户调用Execute 方法执行CommandText 指定的SQL 语句,并得到返回
值。

示例
[Visual Basic]
Public Sub CreateGBaseDataReader(gsSelectQuery As String,_
gsConnection_
As GBaseConnection)
Dim gsCommand As New GBaseCommand(gsSelectQuery, gsConnection)
gsConnection.Open()
Dim gsReader As GBaseDataReader
gsReader = gsCommand.ExecuteReader()
Try
While gsReader.Read()
Console.WriteLine(gsReader.GetString(0))
End While
Finally
gsReader.Close
gsConnection.Close
End Try
End Sub

[C#]
public void CreateGBaseDataReader(string gsSelectQuery,
GBaseConnection gsConnection)
{
GBaseCommand gsCommand = new GBaseCommand(gsSelectQuery,
gsConnection);
gsConnection.Open();
MGBaseDataReader gsReader;
gsReader = gsCommand.ExecuteReader();
try
{
while(gsReader.Read())
{

GBase 8a 程序员手册ADO.NET 篇


- 142 -

南大通用数据技术股份有限公司
Console.WriteLine(gsReader.GetString(0));
}
finally
{
gsReader.Close();
gsConnection.Close();
}
}
}

本章前面的示例显示由列名、运算符和 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_num 和lname 列,但没有每个客户已下订单数的
记录。可以编写 get_orders 例程,该例程查询每个 customer_num 的 orders 表并返回相应订
单的数目(标记为 n_orders)。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 110 -

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;