最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle管道函數(shù)pipelined?function的用法小結(jié)

 更新時間:2023年07月27日 15:29:12   作者:DbWong_0918  
這篇文章主要介紹了Oracle管道函數(shù)pipelined?function的用法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Oracle 管道函數(shù)pipelined function簡單的使用

如果在函數(shù)(function)中加關(guān)鍵字 pipelined,就表明這是一個oracle管道函數(shù),其返回值類型必為 集合,體現(xiàn)出來的數(shù)據(jù)結(jié)構(gòu)類似于表,即可以理解成,使用管道函數(shù)可以返回一張查詢表,可以是單行數(shù)據(jù)也可以是多行數(shù)據(jù),而不是平常函數(shù)返回的單行數(shù)據(jù)

這種返回多行數(shù)據(jù)在需要大數(shù)據(jù)量處理的時候很有用,且在復雜的方法下更好地去處理一些復雜的邏輯查詢

要使用管道函數(shù)的話需要先進行一下類型的類型的創(chuàng)建

首先我們創(chuàng)建一個類型對象

CREATE OR REPLACE Type test_Row_Type As Object
(
  test1 Varchar2(512),
  test2 Varchar2(3000),
  test3 Varchar2(3000),
  test4 Varchar2(3000),
  test5 Varchar2(3000),
  test6 Number,
  test7 Number
)

然后我們創(chuàng)建嵌套的表

CREATE OR REPLACE TYPE test_Row_Type_TABLE AS TABLE OF test_Row_Type;

接下來創(chuàng)建一個臨時表,用來測試數(shù)據(jù)

create table TTTtable
(
  aaa VARCHAR2(50),
  bbb VARCHAR2(50),
  ccc VARCHAR2(50)
)

其中數(shù)據(jù)如下

然后我們開始寫管道函數(shù)

CREATE OR REPLACE FUNCTION test_Row_pipelined(p_varchar in varchar2)
  return test_Row_Type_TABLE
  --關(guān)鍵字加在這里
  pipelined as
  p_num integer := 0;
  ret   test_Row_Type;
begin
  --查詢臨時表數(shù)據(jù)
  for sub_data in (select t.bbb, t.ccc
                     from TTTtable t
                    where t.aaa = p_varchar) loop
    p_num := p_num + 1;
    ret := test_Row_Type(p_num,
                             sub_data.bbb,
                             sub_data.ccc,
                             '',
                             '',
                             0,
                             0);
    --將數(shù)據(jù)放入管道,pipe row()語法被用來返回該集合的單個元素
    pipe row(ret);
  end loop;
  --函數(shù)使用一個空的return結(jié)束
  return;
end;

如果是使用

select test_Row_pipelined('a') from dual

則返回的是<Collection>數(shù)據(jù),此時在PL/SQL中打開就是這樣的

同時,我們還可以使用這種語法

select * from table(test_Row_pipelined('a')) t

結(jié)果也是這樣的,不過推薦使用這種方法,因為這種方式是可以使用where條件去進行過濾的

比如我們加上where

select t.* from table(test_Row_pipelined('a')) t where t.test1 = 1

則得到的結(jié)果就是這樣的

這就是管道函數(shù)的最基本的用法

PS:在管道函數(shù)中可以進行DML操作,一般要加自治事務處理,但是不能直接對管道函數(shù)結(jié)果集進行DML操作,如果要對管道函數(shù)進行DML操作,建議做成視圖再加觸發(fā)器

使用管道函數(shù)制作分割函數(shù)的部分放在了這里

具體實現(xiàn)邏輯:

CREATE OR REPLACE FUNCTION test_Row_pipelined(p_insvar    in varchar2,
                                                  p_delimiter in varchar2)
  return test_Row_Type_TABLE
  pipelined as
  p_num     integer := 1;
  p_num1    integer;
  p_length  integer;
  p_start   integer := 1;
  p_varchar varchar2(200);
  ret       test_Row_Type;
begin
  --如果不是以分隔符結(jié)尾的,就拼接上去
  select case
           when (select count(1)
                   from dual
                  where p_insvar like '%' || p_delimiter) > 0 then
            p_insvar
           else
            p_insvar || p_delimiter
         end
    into p_varchar
    from dual;
  --整個字符串的長度
  select length(p_varchar) into p_length from dual;
  --當起始長度大于整體長度的時候
  while (p_start <= p_length) loop
    --找到字符串與分隔符的分割后的下標
    select instr(p_varchar, p_delimiter, p_start) into p_num1 from dual;
    --如果沒有,則返回全部字符串,說明到了結(jié)尾了
    if p_num1 = 0 then
      ret := test_Row_Type(p_num,
                               substr(p_varchar, p_start),
                               p_num1,
                               p_start,
                               p_length,
                               0,
                               0);
      pipe row(ret);
    else
      --否則,截取字符傳中,從p_start開始找到下標減去p_start的部分
      ret := test_Row_Type(p_num,
                               substr(p_varchar, p_start, p_num1 - p_start),
                               p_num1,
                               p_start,
                               p_length,
                               0,
                               0);
      pipe row(ret);
     --新的起始點為下標加1
      p_start := p_num1 + 1;
    end if;
    --序號加1
    p_num := p_num + 1;
  end loop;
  return;
end;

到此這篇關(guān)于Oracle管道函數(shù)pipelined function簡單的使用的文章就介紹到這了,更多相關(guān)oracle管道函數(shù)使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Oracle 11g簡體中文版安裝圖文教程

    Oracle 11g簡體中文版安裝圖文教程

    這篇文章主要以圖文結(jié)合的方式為大家介紹了Oracle 11g簡體中文版的安裝過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Oracle使用fy_recover_data恢復truncate刪除的數(shù)據(jù)

    Oracle使用fy_recover_data恢復truncate刪除的數(shù)據(jù)

    這篇文章主要介紹了Oracle使用fy_recover_data恢復truncate刪除的數(shù)據(jù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • 教你如何通過PL/SQL創(chuàng)建序列和觸發(fā)器實現(xiàn)表自增字段

    教你如何通過PL/SQL創(chuàng)建序列和觸發(fā)器實現(xiàn)表自增字段

    本文給大家分享如何通過PL/SQL創(chuàng)建序列和觸發(fā)器實現(xiàn)表自增字段,需要注意的是,在數(shù)據(jù)庫操作中,觸發(fā)器的使用對系統(tǒng)資源耗費相對較大,考慮到大表操作的性能問題,?我們盡可能的減少觸發(fā)器的使用,改為直接手動調(diào)用序列函數(shù)即可
    2022-11-11
  • 教你設(shè)計大型Oracle數(shù)據(jù)庫

    教你設(shè)計大型Oracle數(shù)據(jù)庫

    表及索引的存儲容量估算是根據(jù)其記錄長度及估算的最大記錄數(shù)確定的。在容量計算中考慮了數(shù)據(jù)塊的頭開銷及記錄和字段的頭開銷等等。表及索引的initial和next存儲參數(shù)一般設(shè)為相等,pctincrease設(shè)為0。
    2009-06-06
  • Oracle中TO_NUMBER()函數(shù)的使用

    Oracle中TO_NUMBER()函數(shù)的使用

    本文主要講解Oracle數(shù)據(jù)庫中的TO_NUMBER()函數(shù)的相關(guān)知識點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-08-08
  • Oracle undo_management參數(shù)不一致錯誤

    Oracle undo_management參數(shù)不一致錯誤

    因RAC的undo_management參數(shù)不一致導致Oracle數(shù)據(jù)庫mount報ORA-01105 ORA-01606錯誤,本文就這個問題
    2013-11-11
  • oracle RETURNING 子句使用方法

    oracle RETURNING 子句使用方法

    這篇文章主要介紹了oracle RETURNING 子句使用方法,需要的朋友可以參考下
    2016-02-02
  • oracle日期時間型timestamp的深入理解

    oracle日期時間型timestamp的深入理解

    本篇文章是對oracle中日期時間型timestamp函數(shù)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 解決Oracle RMAN刪除歸檔日志不釋放問題的方法

    解決Oracle RMAN刪除歸檔日志不釋放問題的方法

    RMAN清除方式會自動清除磁盤上的歸檔日志文件,同時會釋放控制文件中對應的歸檔日志的歸檔信息,但最近在使用中就遇到了一個問題,下面這篇文章主要給大家介紹了關(guān)于解決Oracle RMAN刪除歸檔日志不釋放問題的方法,需要的朋友可以參考下。
    2017-07-07
  • group by,having,order by的用法詳解

    group by,having,order by的用法詳解

    如果一個查詢中使用了分組函數(shù),任何不在分組函數(shù)中的列或表達式必須要在group by中,下面為大家簡要介紹下group by,having,order by的用法
    2013-09-09

最新評論

黑水县| 武安市| 庄河市| 阜阳市| 将乐县| 德保县| 邛崃市| 舞阳县| 阜新市| 罗田县| 宜章县| 芦山县| 北票市| 上虞市| 达州市| 大理市| 上栗县| 栾城县| 滨海县| 衡东县| 陕西省| 池州市| 启东市| 柯坪县| 海兴县| 曲阜市| 布拖县| 耒阳市| 永定县| 平度市| 昌邑市| 山西省| 盘锦市| 屏东县| 成安县| 石渠县| 临清市| 长葛市| 正蓝旗| 迁安市| 长宁县|