首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 常用函數與進階技巧實戰速查

     編輯:Oracle 教學

高頻函數與實用模式集錦

一、管道化表函數:高效返回集合

-- 1. 定義物件類型與集合類型
CREATE TYPE row_typedepluju AS OBJECT (rootid NUMBER(19), projectid NUMBER(19));
CREATE TYPE table_typedepluju AS TABLE OF row_typedepluju;

-- 2. 管道化函數
CREATE OR REPLACE FUNCTION getlujudepinfobyaccount (useraccount IN VARCHAR2)
RETURN table_typedepluju PIPELINED AS
  v row_typedepluju;
BEGIN
  FOR myrowdep IN (
    SELECT t.id AS rootid, pinfo.id AS projectid
    FROM base_security_department t
    LEFT JOIN pbs_projectinfo pinfo ON pinfo.constructiondep_id = t.id
    WHERE t.useflag = 1 AND t.grade IN (60,130)
    START WITH t.id = (SELECT a.departmentid FROM base_security_userinfo a WHERE a.account = useraccount)
    CONNECT BY PRIOR t.parentid = t.id
  ) LOOP
    v := row_typedepluju(myrowdep.rootid, myrowdep.projectid);
    PIPE ROW (v);
  END LOOP;
  RETURN;
END;

優勢:流式返回,無需在記憶體中構建整個集合,適合大結果集 ETL/報表。

二、MINUS 集合差集:找出關聯表中不存在的值

INSERT INTO base_security_deptproject (departmentid, projectid)
SELECT v.DEPARTMENTID, v.PROJECTID FROM (
  -- 逗號分隔字串拆行
  WITH temp0 AS (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 20)
  SELECT g.id AS DEPARTMENTID,
         SUBSTR(g.PROJECTIDS, INSTR(g.PROJECTIDS, ',', 1, tv.lv) + 1,
                INSTR(g.PROJECTIDS, ',', 1, tv.lv + 1) - INSTR(g.PROJECTIDS, ',', 1, tv.lv) - 1) AS PROJECTID
  FROM BASE_SECURITY_DEPARTMENT g
  JOIN temp0 tv ON tv.lv <= LENGTH(g.PROJECTIDS) - LENGTH(REPLACE(g.PROJECTIDS, ',')) 
  WHERE g.GRADE = '145' AND g.USEFLAG = '1' AND g.PROJECTIDS IS NOT NULL
) v
WHERE v.PROJECTID IS NOT NULL
MINUS
SELECT t.DEPARTMENTID, TO_CHAR(t.PROJECTID) FROM BASE_SECURITY_DEPTPROJECT t;

三、層次查詢:START WITH ... CONNECT BY

-- 展現整棵組織樹
SELECT * FROM base_security_department t
CONNECT BY PRIOR t.parentid = t.id
START WITH t.id = 2400;

四、字串截取 SUBSTR 進階

-- 取編碼最後兩位並 +1 生成新編碼
SELECT DECODE(MAX(SUBSTR(t.bscode, LENGTH(t.bscode)-1, 2)), NULL, 0,
       MAX(SUBSTR(t.bscode, LENGTH(t.bscode)-1, 2)) + 1) AS codenum
FROM base_security_department t
WHERE t.useflag = 1 AND t.bscode LIKE 'XKHJ01SG07SY__';

五、序列 NEXTVAL 特性

  • 每次調用 seq.NEXTVAL 必然遞增,即使語句回滾、事務失敗,序列值也不回退 (Gap 是正常現象)。
  • seq.CURRVAL 僅在當前 Session 已調用過 NEXTVAL 後可用。

六、常用內建函數速查表

分類函數說明
字串SUBSTR(str, pos, len)截取
INSTR(str, substr, pos, occ)查找子串位置
REPLACE(str, old, new)替換
LTRIM/RTRIM/TRIM去空格/字元
||連接
DECODE/CASE條件轉換
日期SYSDATE/SYSTIMESTAMP當前日期/時間戳
ADD_MONTHS(d, n)月份加減
MONTHS_BETWEEN(d1, d2)月差
LAST_DAY(d)該月最後一天
TO_CHAR/TO_DATE格式轉換
數值ROUND/TRUNC四捨五入/截斷
MOD取模
CEIL/FLOOR向上/向下取整
POWER冪運算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved