程式設計實務

使用下列程式設計實務。

使用設備套件

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 中所述),而是會在表格上建立以函數為基礎的索引,然後在每個交易中使用該函數來擷取資料列和顯示訊息。

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