编程惯例

使用以下编程练习。

使用金融工具包

Oracle Database 提供了其子程序允许应用程序在必要时生成跟踪信息的检测软件包。使用此跟踪信息,您可以在没有调试器的情况下调试应用程序,并确定执行不良的代码。

仪器为您的应用程序提供了相当大的功能;因此,它不是开销。开销是可以消除的,而不会失去很多好处。

以下检测软件包由 Oracle Database 提供:

另请参阅: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 程序包和类型。

许多开发人员重新发明的现有功能的示例包括以下功能:

示例 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

另请参见:

使用版本化视图覆盖数据库表

如果应用程序使用数据库表,请使用版本视图覆盖每个表,以便可以使用基于版本的重新定义 (EBR) 在应用程序使用过程中升级其数据库组件,从而最大限度地减少或消除停机时间。

有关基于版本的重新定义的信息,请参阅 Oracle Database Development Guide