日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle中过程/函数返回结果集

發(fā)布時間:2024/4/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle中过程/函数返回结果集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnitblog.com/wufajiaru/archive/2009/04/28/56796.html

Oracle 存儲過程返回結(jié)果集

關(guān)鍵字: 轉(zhuǎn)載

Sql代碼
  • Oracle?存儲過程返回結(jié)果集 ??
  • ??
  • 過程返回記錄集:? ??
  • CREATE?OR?REPLACE?PACKAGE?pkg_test? ??
  • AS? ??
  • ????TYPE?myrctype?IS?REF?CURSOR;? ??
  • ?? ??
  • ????PROCEDURE?get?(p_id?NUMBER,?p_rc?OUT?myrctype);? ??
  • END?pkg_test;? ??
  • /? ??
  • ?? ??
  • CREATE?OR?REPLACE?PACKAGE?BODY?pkg_test? ??
  • AS? ??
  • ????PROCEDURE?get?(p_id?NUMBER,?p_rc?OUT?myrctype)? ??
  • ????IS? ??
  • ???????sqlstr???VARCHAR2?(500);? ??
  • ????BEGIN? ??
  • ???????IF?p_id?=?0?THEN? ??
  • ??????????OPEN?p_rc?FOR? ??
  • ?????????????SELECT?ID,?NAME,?sex,?address,?postcode,?birthday? ??
  • ???????????????FROM?student;? ??
  • ???????ELSE? ??
  • ??????????sqlstr?:=? ??
  • ?????????????'select?id,name,sex,address,postcode,birthday? ??
  • ????????????from?student?where?id=:w_id';? ??
  • ??????????OPEN?p_rc?FOR?sqlstr?USING?p_id;? ??
  • ???????END?IF;? ??
  • ????END?get;? ??
  • END?pkg_test;? ??
  • /? ??
  • ?? ??
  • 函數(shù)返回記錄集:? ??
  • 建立帶ref?cursor定義的包和包體及函數(shù):? ??
  • CREATE?OR?REPLACE? ??
  • package?pkg_test?as? ??
  • /*?定義ref?cursor類型? ??
  • ????不加return類型,為弱類型,允許動態(tài)sql查詢,? ??
  • ????否則為強類型,無法使用動態(tài)sql查詢;? ??
  • */? ??
  • ???type?myrctype?is?ref?cursor;?? ??
  • ??? ??
  • --函數(shù)申明? ??
  • ???function?get(intID?number)?return?myrctype;? ??
  • end?pkg_test;? ??
  • /? ??
  • ??? ??
  • CREATE?OR?REPLACE? ??
  • package?body?pkg_test?as? ??
  • --函數(shù)體? ??
  • ????function?get(intID?number)?return?myrctype?is? ??
  • ??????rc?myrctype;??--定義ref?cursor變量???
  • ??????sqlstr?varchar2(500);? ??
  • ????begin? ??
  • ??????if?intID=0?then? ??
  • ?????????--靜態(tài)測試,直接用select語句直接返回結(jié)果???
  • ?????????open?rc?for?select?id,name,sex,address,postcode,birthday?from?student;? ??
  • ??????else? ??
  • ?????????--動態(tài)sql賦值,用:w_id來申明該變量從外部獲得???
  • ?????????sqlstr?:=?'select?id,name,sex,address,postcode,birthday?from?student?where?id=:w_id';? ??
  • ?????????--動態(tài)測試,用sqlstr字符串返回結(jié)果,用using關(guān)鍵詞傳遞參數(shù)???
  • ?????????open?rc?for?sqlstr?using?intid;? ??
  • ??????end?if;? ??
  • ??? ??
  • ??????return?rc;? ??
  • ????end?get;? ??
  • ??? ??
  • end?pkg_test;? ??
  • /???
  • =================
  • http://blog.csdn.net/feiliu010/article/details/1538822

    Oracle中函數(shù)/過程返回結(jié)果集的幾種方式:
    ??? 以函數(shù)return為例,存儲過程只需改為out參數(shù)即可,在oracle 10g測試通過.
    ??? (1) 返回游標(biāo):
    ??? ??? return的類型為:SYS_REFCURSOR
    ??? ??? 之后在IS里面定義變量:curr SYS_REFCURSOR;
    ??? ??? 最后在函數(shù)體中寫:
    ??? ??? ?open cur for
    ??? ??? ??? select ......;
    ??? ??? ?return cur;
    ??? ??? 例:
    ??? ???

    CREATE?OR?REPLACE?FUNCTION?A_Test(
    ????????????????orType?
    varchar2
    ????????)
    RETURN?SYS_REFCURSOR
    ????????
    is
    ???????????????type_cur?SYS_REFCURSOR;
    ????????
    BEGIN
    ????????????
    OPEN?type_cur?FOR
    ????????????????????
    select?col1,col2,col3?from?testTable?;
    ??????????????????
    RETURN??type_cur;
    ????????
    END;


    ??? (2)返回table類型的結(jié)果集:
    ??? ??? 首先定義一個行類型:
    ??? ??? ???

    CREATE?OR?REPLACE?TYPE?"SPLIT_ARR"??AS?OBJECT(nowStr?varchar2(18))


    ??? ??? 其次以此行類型定義一個表類型:
    ??? ??? ?

    ??CREATE?OR?REPLACE?TYPE?"SPLIT_TAB"?AS?TABLE?of?split_arr;


    ??? ??? 定義函數(shù)(此函數(shù)完成字符串拆分功能):
    ??? ??? ???

    CREATE?OR?REPLACE?FUNCTION?GetSubStr(
    ???????????????????
    str?in?varchar2,?--待分割的字符串
    ???????????????????splitchar?in?varchar2?--分割標(biāo)志
    ????????????)
    ????????????
    return?split_tab
    ????????????
    IS
    ??????????????restStr?
    varchar2(2000)?default?GetSubStr.str;--剩余的字符串
    ??????????????thisStr?varchar2(18);--取得的當(dāng)前字符串
    ??????????????indexStr?int;--臨時存放分隔符在字符串中的位置
    ?????????????
    ??????????????v?split_tab?:
    =?split_tab();?--返回結(jié)果

    ????????????
    begin
    ?????????????????dbms_output.put_line(restStr);
    ?????????????????
    while?length(restStr)?!=?0
    ???????????????????LOOP
    ?????????????????????
    <<top>>
    ?????????????????????indexStr?:
    =?instr(restStr,splitchar);?--從子串中取分隔符的第一個位置

    ?????????????????????
    if?indexStr?=?0?and?length(restStr)?!=?0??then--在剩余的串中找不到分隔符
    ????????????????????????begin
    ??????????????????????????v.extend;
    ??????????????????????????v(v.
    count)?:=?split_arr(Reststr);
    ??????????????????????????
    return?v;
    ????????????????????????
    end;
    ?????????????????????
    end?if;
    ????????????????????
    ?????????????????????
    if?indexStr?=?1?then---第一個字符便為分隔符,此時去掉分隔符
    ????????????????????????begin
    ?????????????????????????????restStr?:
    =?substr(restStr,2);
    ?????????????????????????????
    goto???top;
    ????????????????????????
    end;
    ?????????????????????
    end?if;
    ????????????????????
    ?????????????????????
    if?length(restStr)?=?0?or?restStr?is?null?then
    ????????????????????????
    return?v;
    ?????????????????????
    end?if;
    ???????????????????
    ?????????????????????v.extend;
    ?????????????????????thisStr?:
    =?substr(restStr,1,indexStr?-?1);?--取得當(dāng)前的字符串
    ?????????????????????restStr?:=?substr(restStr,indexStr?+?1);---取剩余的字符串

    ?????????????????????v(v.
    count)?:=?split_arr(thisStr);
    ???????????????????
    END?LOOP;
    ?????????????????
    return?v;
    ????????????
    end;


    ??? ??? 在PL/SQL developer中可以直接調(diào)用
    ??? ??? ??

    cursor?strcur?is
    ?????????????????????????
    select?nowStr?from?Table(GetSubStr('111,222,333,,,',','));


    ??? (3)以管道形式輸出:
    ??? ???

    create?type?row_type?as?object(a?varchar2(10),?v?varchar2(10));--定義行對象
    ????????create?type?table_type?as?table?of?row_type;?--定義表對象
    ????????create?or?replace?function?test_fun(
    ????????????a?
    in?varchar2,b?in?varchar2
    ????????)
    ????????
    return?table_type?pipelined
    ????????
    is
    ????????????v?row_type;
    --定義v為行對象類型
    ????????begin
    ??????????
    for?thisrow?in?(select?a,?b?from?mytable?where?col1=a?and?col2?=?b)?loop
    ????????????v?:
    =?row_type(thisrow.a,?thisrow.b);
    ????????????
    pipe?row?(v);
    ??????????
    end?loop;
    ??????????
    return;
    ????????
    end;
    ????????
    select?*?from?table(test_fun('123','456'));



    ?

    ================================fetch into 顯示兩次

    open v_cursor for ?
    ?select 1from dual;
    ?
    loop
    ????? fetch v_cursor into v_num;

    DBMS_OUTPUT.PUT_LINE(v_num);
    ?????exit when v_cursor%notfound;??????
    ????end loop;
    ?? ?close v_cursor;

    ?

    將DBMS_OUTPUT.PUT_LINE(v_num); 放到exit when v_cursor%notfound;??之后就不會顯示兩次了

    總結(jié)

    以上是生活随笔為你收集整理的Oracle中过程/函数返回结果集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。