DB2 9.7: 在 DB2 9.7 中使用 PL/SQL 匿名块
2009-10-16 00:00:00 来源:WEB开发网使用匿名块生成即席报告
一个常见的报告需求就是将数据从多个列合并到一个字符串中。这可以通过编写带有复杂递归的纯 SQL 语句来实现。不过,您可以使用带有动态格式化选项和简单逻辑流程的匿名块来更快地实现该目的。
清单 5 显示了如何在匿名块的帮助下创建一个即席报告。清单 5 的代码获取一个包含所有从商店订购产品的客户的列表,以及上个月的所有订单的总价值。在一行显示名称,名称之间用逗号分隔。
清单 5. 在匿名块的帮助下创建即席报告
SET SERVEROUTPUT ON
/
DECLARE
v_customer_names VARCHAR2(4000);
v_total_sales NUMBER(19,2);
BEGIN
DBMS_OUTPUT.PUT_LINE(' Last Month Sales Report ');
DBMS_OUTPUT.PUT_LINE('---------------------------------------');
DBMS_OUTPUT.PUT('Customer List: ');
FOR row IN
(SELECT distinct(a.customer_id),first_name, last_name FROM customer a, orders b
WHERE a.customer_id=b.order_id AND b.creation_time>CURRENT DATE -1 month)
LOOP
v_customer_names := v_customer_names || '"' || row.first_name || ' ' ||
row.last_name || '", ';
END LOOP;
IF(LENGTH(v_customer_names) > 0) THEN
v_customer_names := SUBSTR(v_customer_names,1, LENGTH(v_customer_names)-2);
ELSE
v_customer_names := 'None';
END IF;
DBMS_OUTPUT.PUT_LINE(v_customer_names);
SELECT NVL(SUM(total_price),0) INTO v_total_sales FROM orders WHERE creation_time>
CURRENT DATE - 1 month;
DBMS_OUTPUT.PUT_LINE('---------------------------------------');
DBMS_OUTPUT.PUT_LINE('Total Sales: ' || TO_CHAR(v_total_sales, '$99,999,999.99'));
END;
/
Output:
Last Month Sales Report ---------------------------------------
Customer List: "Mike Smith", "Joan Jett", "Colin Taylor", "Graham Norton", "Patsy Stone"
---------------------------------------
Total Sales: $ 49,772.56
结束语
本文介绍了以下内容:
在 DB2 9.7 中引入的 PL/SQL 匿名块特性。
匿名块的概念。
匿名块如何为过程代码的测试、原型化和问题诊断提供便利。
匿名块如何模拟应用程序的运行。
如何使用匿名块实现强大的即席报告。
在 PL/SQL 匿名块的帮助下,您可以通过使用现有的 PL/SQL 脚本,或通过使用能够在其他数据库管理系统中工作的 PL/SQL 和 SQL 语句,在 DB2 环境中快速实现 PL/SQL 解决方案。
更多精彩
赞助商链接