Skip to content

有害部落格同好會

2012/07/20 / Database

關於 pipe row 應用, split or merge 字串

Oralce 有種 pipelining 的技術, 可以執行 SQL 時可以產生一個虛擬 Table,

這項技術可用來彌補 function 傳值時的限制

程式碼:

  -- 宣告類型
  CREATE OR REPLACE TYPE xx_split_tbl IS TABLE OF VARCHAR2 (4000);
 
  -----------------------------------------------------------
  -- 傳入字串 + 分隔符號, 傳回 單一欄位的 table, 欄位名: column_value
  -----------------------------------------------------------
  FUNCTION get_split_tbl(p_list VARCHAR2, p_del VARCHAR2 DEFAULT ';')
    RETURN xx_split_tbl
    PIPELINED IS
    v_idx  PLS_INTEGER;
    v_list VARCHAR2(32767) := p_list;
  BEGIN
    LOOP
      v_idx := INSTR(v_list, p_del);
      IF v_idx > 0 THEN
        PIPE ROW(SUBSTR(v_list, 1, v_idx - 1));
        v_list := SUBSTR(v_list, v_idx + LENGTH(p_del));
      ELSE
        PIPE ROW(v_list);
        EXIT;
      END IF;
    END LOOP;
    RETURN;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END get_split_tbl;
 
  -----------------------------------------------------------
  -- 傳入單一欄位的 table + 分隔符號, 傳回組合的字串
  -----------------------------------------------------------
  FUNCTION get_merge_str(p_cursor SYS_REFCURSOR,
                         p_del    VARCHAR2 DEFAULT ';') RETURN VARCHAR2 IS
    v_value  VARCHAR2(32767);
    v_result VARCHAR2(32767);
  BEGIN
    LOOP
      FETCH p_cursor
        INTO v_value;
      EXIT WHEN p_cursor%NOTFOUND;
      IF v_result IS NOT NULL THEN
        v_result := v_result || p_del;
      END IF;
      v_result := v_result || v_value;
    END LOOP;
    CLOSE p_cursor;
    RETURN v_result;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END get_merge_str;

-- 宣告類型 CREATE OR REPLACE TYPE xx_split_tbl IS TABLE OF VARCHAR2 (4000); ----------------------------------------------------------- -- 傳入字串 + 分隔符號, 傳回 單一欄位的 table, 欄位名: column_value ----------------------------------------------------------- FUNCTION get_split_tbl(p_list VARCHAR2, p_del VARCHAR2 DEFAULT ';') RETURN xx_split_tbl PIPELINED IS v_idx PLS_INTEGER; v_list VARCHAR2(32767) := p_list; BEGIN LOOP v_idx := instr(v_list, p_del); IF v_idx > 0 THEN PIPE ROW(substr(v_list, 1, v_idx - 1)); v_list := substr(v_list, v_idx + length(p_del)); ELSE PIPE ROW(v_list); EXIT; END IF; END LOOP; RETURN; EXCEPTION WHEN OTHERS THEN RAISE; END get_split_tbl; ----------------------------------------------------------- -- 傳入單一欄位的 table + 分隔符號, 傳回組合的字串 ----------------------------------------------------------- FUNCTION get_merge_str(p_cursor SYS_REFCURSOR, p_del VARCHAR2 DEFAULT ';') RETURN VARCHAR2 IS v_value VARCHAR2(32767); v_result VARCHAR2(32767); BEGIN LOOP FETCH p_cursor INTO v_value; EXIT WHEN p_cursor%NOTFOUND; IF v_result IS NOT NULL THEN v_result := v_result || p_del; END IF; v_result := v_result || v_value; END LOOP; CLOSE p_cursor; RETURN v_result; EXCEPTION WHEN OTHERS THEN RAISE; END get_merge_str;

使用範例:

1. 字串拆解成 TABLE
SELECT column_value
  FROM TABLE(xxutlpkg.get_split_tbl('01;02;03;04;09;11;12', ';'));
 
2. TABLE 某欄位組成 字串+分隔符號
SELECT xxutlpkg.get_merge_str(CURSOR (SELECT wafer_id
                                 FROM xxwip_clot_line l
                                WHERE l.sub_lot_id = 'FP8312.1'
                                ORDER BY wafer_id),
                              ';')
  FROM dual;

1. 字串拆解成 table SELECT column_value FROM TABLE(xxutlpkg.get_split_tbl('01;02;03;04;09;11;12', ';')); 2. table 某欄位組成 字串+分隔符號 SELECT xxutlpkg.get_merge_str(CURSOR (SELECT wafer_id FROM xxwip_clot_line l WHERE l.sub_lot_id = 'FP8312.1' ORDER BY wafer_id), ';') FROM dual;

Post navigation

Previous Post:

設定 Oracle ERP 瀏覽器預設編碼語系

Next Post:

使用 API 建立 valueset

分類

  • 新奇有趣の搶先報導
    • Raspberry Pi
    • 手機相關
    • 推薦軟體
    • 新鮮有趣
    • 生活資訊
  • 想破腦袋の程式技巧
    • Oracle EBS
    • Database
    • Excel, VBA
    • php
    • JavaScript, VBScript
    • VS.NET
    • Others
    • Windows
    • SAP
  • 撩動心弦の短文小品
  • 聚沙成塔の理財守則
  • 不可不知の職場實錄
  • 剎那永恆の生活翦影

近期文章

  • 受保護的內容: 如何透過Personalize功能呼叫另一form來回傳值
  • Win10 / 8 / 7 無法安裝 SSD
  • 受保護的內容: 樹梅派+遠端連線
  • EBS R12 取得客戶的phone, email, URL資料
  • 受保護的內容: 管控Workflow Administrator Role

友站

  • Masaya396's 協奏曲
  • 老塗的咁仔店

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

Tag Cloud

你目前使用的瀏覽器不支援 HTML5 的 CANVAS 標籤。

  • SAP
  • WinXP
  • excel
  • SQL
  • Oracle EBS
  • HTC
  • EBS 11.5.10
  • VB6
  • CSS
  • javascript
  • VB.Net
  • php
  • VBA
  • MySql
  • Oracle DB
  • EBS 12.1.3
  • LDAP
  • 管理
  • 感情
  • Win7
© 2025 有害部落格同好會 - Powered by SimplyNews