嶺澳核電站資料庫平台:Oracle 7.3 後端 + Developer 2000 / Designer 2000 前端,C/S 架構。分享實戰開發與管理心得。
-- 查重 (以 DRAWING、DSNO 為業務鍵)
SELECT drawing, dsno FROM em5_pipe_prefab
WHERE rowid != (SELECT MAX(rowid) FROM em5_pipe_prefab d
WHERE em5_pipe_prefab.drawing = d.drawing
AND em5_pipe_prefab.dsno = d.dsno);
-- 刪重 (保留 ROWID 最大者)
DELETE FROM em5_pipe_prefab
WHERE rowid != (SELECT MAX(rowid) FROM em5_pipe_prefab d
WHERE em5_pipe_prefab.drawing = d.drawing
AND em5_pipe_prefab.dsno = d.dsno);
資料庫遷移重建後,視圖跨表空間引用失效,需重新編譯:
SPOOL compile_views.sql
SELECT 'ALTER VIEW ' || tname || ' COMPILE;' FROM tab;
SPOOL OFF
@compile_views.sql
-- 批量授權
SELECT 'GRANT SELECT ON ' || tname || ' TO username;' FROM tab;
-- 批量建同義詞
SELECT 'CREATE SYNONYM ' || tname || ' FOR username.' || tname || ';' FROM tab;
-- 原寫法:NOT IN 子查詢,10000x10000 比對,30 分鐘
SELECT pay_no, project_name FROM a
WHERE a.pay_no NOT IN (SELECT pay_no FROM b WHERE value >= 120000);
-- 改寫:LEFT JOIN + IS NULL,約 1 分鐘
SELECT a.pay_no, a.project_name
FROM a LEFT JOIN b ON a.pay_no = b.pay_no AND b.value >= 120000
WHERE b.pay_no IS NULL;
:OLD.dept_no -- 修改前值
:NEW.dept_no -- 修改後值
-- Form 級 WHEN-NEW-FORM-INSTANCE 觸發器
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, TITLE, 'POWER SYSTEM 歡迎使用');
建立 Menu Item:Type=Magic, Command Type=Null, Magic Item=Window, Label 留白。
-- Form WHEN-NEW-FORM-INSTANCE 呼叫
PROCEDURE dyn_list IS
rg RECORDGROUP;
BEGIN
rg := CREATE_GROUP_FROM_QUERY('spec_rg', 'SELECT specification FROM cable_account');
POPULATE_GROUP(rg);
POPULATE_LIST('EBOP_CABLE_ACCOUNT.SPECIFICATION', rg);
END;
Canvas 1 (Content) 放主鍵欄位;Canvas 2 (Stack) 放其餘欄位。建立 Block 時選 Canvas 1,再將非主鍵欄位 Canvas 屬性改為 Canvas 2。水平捲軸/TAB/Enter 可瀏覽所有欄位。
建立 Server 端 Procedure DB_SQL_COMMIT,受限觸發器中呼叫 DB_SQL_COMMIT; 繞過限制。
Block 級 WHEN-CREATE-RECORD 觸發器::VO.VO_ID := :SYSTEM.TRIGGER_RECORD;
-- 呼叫端
DECLARE pm PARAMLIST;
BEGIN
pm := GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(pm) THEN DESTROY_PARAMETER_LIST('PM'); END IF;
pm := CREATE_PARAMETER_LIST('PM');
ADD_PARAMETER(pm, 'THE_WHERE', TEXT_PARAMETER, 'EM_NAME=''EM4'' AND EM_PROJECT_NAME=''支架預制''');
OPEN_FORM('PAYMENT', ACTIVATE, SESSION, pm);
END;
-- 被呼叫 Form (PAYMENT) WHEN-NEW-FORM-INSTANCE
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT', DEFAULT_WHERE, :PARAMETER.THE_WHERE);
END IF;
修改 Program Unit CLEAR_ALL_MASTER_DETAILS,調整邏輯實現自動儲存。
DROP TABLE、DELETE * FROM table 皆不釋放表空間高水位,反覆操作會耗盡表空間。TRUNCATE TABLE table_name 瞬間釋放空間並重置高水位。
SHUTDOWNmv /ora13/orarun/document.dbf /ora12/orarun/STARTUP MOUNTALTER DATABASE RENAME FILE '/ora13/orarun/document.dbf' TO '/ora12/orarun/document.dbf';ALTER DATABASE OPEN使用 ALTER DATABASE 而非 ALTER TABLESPACE 適用性更強。