编程惯例
使用以下编程练习。
使用金融工具包
Oracle Database 提供了其子程序允许应用程序在必要时生成跟踪信息的检测软件包。使用此跟踪信息,您可以在没有调试器的情况下调试应用程序,并确定执行不良的代码。
仪器为您的应用程序提供了相当大的功能;因此,它不是开销。开销是可以消除的,而不会失去很多好处。
以下检测软件包由 Oracle Database 提供:
-
DBMS_APPLICATION_INFO 使系统管理员能够按模块跟踪应用程序的性能。
有关 DBMS_APPLICATION_INFO 的更多信息,请参阅 Oracle Database PL/SQL Packages and Types Reference。
-
使用 DBMS_SESSION,应用程序可以访问会话信息并设置首选项和安全级别
有关 DBMS_SESSION 的更多信息,请参阅 Oracle Database PL/SQL Packages and Types Reference。
-
UTL_FILE 允许应用程序读取和写入操作系统文本文件
有关 UTL_FILE 的更多信息,请参阅 Oracle Database PL/SQL Packages and Types Reference。
另请参阅:Oracle Database PL/SQL Packages and Types Reference,以获取 Oracle Database 提供的 PL/SQL 程序包摘要
统计信息收集和应用程序跟踪
数据库统计信息提供有关数据库中负载类型和数据库所使用的内部和外部资源的相关信息。要使用 ADDM 准确地诊断数据库的性能问题,统计信息必须可用。
有关统计信息收集的信息,请参阅 Oracle Database 2 Day + Performance Tuning Guide。
注:如果 Oracle Enterprise Manager 不可用,则可以使用 DBMS_MONITOR 子程序收集统计信息,如Oracle Database PL/SQL Packages and Types Reference 中所述。
Oracle Database 提供了多种跟踪工具,可帮助您监视和分析 Oracle Database 应用程序。有关详细信息,请参阅 Oracle Database SQL Tuning Guide。
使用现有功能
使用现有功能的应用程序比不使用现有功能的应用程序更容易开发和维护,并且运行速度也更快。
开发应用程序时,请使用编程语言的现有功能、操作系统、Oracle Database 以及 Oracle Database 尽可能提供的 PL/SQL 程序包和类型。
许多开发人员重新发明的现有功能的示例包括以下功能:
-
约束
有关约束条件的介绍性信息,请参阅确保表中的数据完整性。
-
SQL 函数(“内置到”SQL 中的函数)
有关 SQL 函数的信息,请参阅 Oracle Database SQL Language Reference。
-
序列(可以生成唯一的序列值)
请参阅“创建和管理序列”。
-
审计(对所选用户数据库操作进行的监视和记录)
有关审计的介绍性信息,请参阅《 Oracle Database Security Guide 》。
-
复制(在组成分布式数据库系统的多个数据库中复制和维护数据库对象(如表)的过程)
有关复制的信息,请参阅 Oracle GoldenGate 文档。
-
消息排队(基于 Web 的业务应用程序如何相互通信)
有关 Oracle Database Advanced Queuing (AQ) 的介绍性信息,请参阅 Oracle Database Advanced Queuing User’s Guide。
-
维护记录更改的历史记录
有关 Workspace Manager 的介绍性信息,请参阅 Oracle Database Workspace Manager Developer’s Guide。
在示例 8-4 中,两个并发事务处理将存储在表中的消息出队(即,每个事务处理查找并锁定表的下一个未处理行)。此示例不只是调用 DBMS_AQ.DEQUEUE 过程(如Oracle Database PL/SQL Packages and Types Reference 中所述),而是对表创建基于函数的索引,然后在每个事务处理中使用该函数来检索行并显示消息。
Example 8-4 中的代码实现了与 DBMS_AQ.DEQUEUE 调用类似但功能较少的功能。使用现有功能(在本例中为基于函数的索引)节省的开发时间可能会很大。
示例 8-4 并发出队事务处理
创建表:
DROP TABLE t;
CREATE TABLE t
( id NUMBER PRIMARY KEY,
processed_flag VARCHAR2(1),
payload VARCHAR2(20)
);
创建表的索引:
CREATE INDEX t_idx ON
t( DECODE( processed_flag, 'N', 'N' ) );
植入表:
INSERT INTO t
SELECT r,
CASE WHEN MOD(r,2) = 0 THEN 'N' ELSE 'Y' END,
'payload ' || r
FROM (SELECT LEVEL r FROM DUAL CONNECT BY LEVEL <= 5);
显示表:
SELECT * FROM t;
结果:
ID P PAYLOAD
---------- - --------------------
1 Y payload 1
2 N payload 2
3 Y payload 3
4 N payload 4
5 Y payload 5
5 rows selected.
第一个事务处理:
DECLARE
l_rec t%ROWTYPE;
CURSOR c IS
SELECT *
FROM t
WHERE DECODE(processed_flag,'N','N') = 'N'
FOR UPDATE
SKIP LOCKED;
BEGIN
OPEN c;
FETCH c INTO l_rec;
IF ( c%FOUND ) THEN
DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
END IF;
CLOSE c;
END;
/
结果:
Got row 2, payload 2
并发事务处理:
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
l_rec t%ROWTYPE;
CURSOR c IS
SELECT *
FROM t
WHERE DECODE(processed_flag,'N','N') = 'N'
FOR UPDATE
SKIP LOCKED;
BEGIN
OPEN c;
FETCH c INTO l_rec;
IF ( c%FOUND ) THEN
DBMS_OUTPUT.PUT_LINE( 'Got row ' || l_rec.id || ', ' || l_rec.payload );
END IF;
CLOSE c;
COMMIT;
END;
/
结果:
Got row 4, payload 4
另请参见:
-
Oracle Database Concepts(每个发行版)
使用版本化视图覆盖数据库表
如果应用程序使用数据库表,请使用版本视图覆盖每个表,以便可以使用基于版本的重新定义 (EBR) 在应用程序使用过程中升级其数据库组件,从而最大限度地减少或消除停机时间。
有关基于版本的重新定义的信息,请参阅 Oracle Database Development Guide。