<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    存儲過程的一些用法

    最近在用存儲過程,在網上找了很多的資料,下面就參考各種資料整理的一些小例子做些闡述:
    1. Oralce TO_NUMBER() function 的改進:
    用Oracle TO_NUMBER進行類型轉換的時候,如果有無效數字,將返回錯誤。遺憾的是,Oralce TO_NUMBER并不是在query運行開始就報錯,而是到碰到無效數字的紀錄才報錯,而且只是說無效輸入,并不提示是哪條紀錄,也沒有任何輸出。如果是一張大表,query運行很久才來這么一下,而且根本不知道那里出的錯,是什么值,豈不痛苦?偶就經常跟這樣的表打交道,遂自建一個函數,GET_NUM:

    CREATE OR REPLACE FUNCTION GET_NUM(IN_TXT in VARCHAR2) RETURN NUMBER IS
    RETRUN_VALUE NUMBER;
    BEGIN
    ?select to_number(IN_TXT) into RETRUN_VALUE from dual;
    ?RETURN RETRUN_VALUE;
    ?
    ?EXCEPTION
    ?WHEN others
    ?THEN
    ?RETURN null;
    END GET_NUM;
    /
    這樣無效數字全轉換成 Null,糾錯容易多了。

    寫個存儲過程測試一下:
    CREATE OR REPLACE PROCEDURE TestFun IS
    ??? v_name varchar2(10);/***** 存放cursor_para中的name *****/
    ??? CURSOR cursor_name IS select name from test;
    ??? cursor cursor_para(p_num number) is select name from test where num = p_num;
    begin
    ? /******* t_name為循環的臨時變量******/
    ? FOR t_name IN cursor_name LOOP
    ?
    ? ? if (get_num(t_name.name) is not null) then
    ?? ?
    ???open cursor_para(get_num(t_name.name));
    ???
    ???fetch cursor_para into v_name;
    ???
    ???DBMS_OUTPUT.PUT_LINE('Name:'|| v_name);
    ???
    ???close cursor_para;
    ????? ?
    ?? end if;
    ??
    ? END LOOP;
    END TestFun;
    /
    存儲過程也用到了帶參數的游標和游標For循環,稍后介紹.

    其中測試表的創建:
    create table test
    (
    ???? name varchar2(10),
    ??? num number
    )

    測試數據:
    insert into test(name) values ('12_');
    insert into test(name) values ('123');

    2.帶參數的游標

      與存儲過程和函數相似,可以將參數傳遞給游標并在查詢中使用。這對于處理在某種條件下打開游標的情況非常有用。它的語法如下:

    CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

      定義參數的語法如下:

    Parameter_name [IN] data_type[{:=|DEFAULT} value]

      與存儲過程不同的是,游標只能接受傳遞的值,而不能返回值。參數只定義數據類型,沒有大小。

      另外可以給參數設定一個缺省值,當沒有參數值傳遞給游標時,就使用缺省值。游標中定義的參數只是一個占位符,在別處引用該參數不

    一定可靠。

      在打開游標時給參數賦值,語法如下:

    OPEN cursor_name[value[,value]....];

    3.游標FOR循環

      在大多數時候我們在設計程序的時候都遵循下面的步驟:

      1、打開游標

      2、開始循環

      3、從游標中取值

      4、檢查那一行被返回

      5、處理

      6、關閉循環

      7、關閉游標

      可以簡單的把這一類代碼稱為游標用于循環。但還有一種循環與這種類型不相同,這就是FOR循環,用于FOR循環的游標按照正常的聲明方

    式聲明,它的優點在于不需要顯式的打開、關閉、取數據,測試數據的存在、定義存放數據的變量等等。游標FOR 循環的語法如下:

    FOR record_name IN
    (corsor_name[(parameter[,parameter]...)]
    | (query_difinition)
    LOOP
    statements
    END LOOP;

    上面的這兩個用法也在例子中提到了!

    同理類推,也可以將TO_DATE()函數改進。

    下面的例子自http://www.nikicn.com/bbs/dispbbs.asp?boardid=23&id=908
    沒有測試,留作備份之用:
    4. 將Oracle 的Last_Day()函數改寫到DB2上:
    DROP SPECIFIC FUNCTION LAST_DAYDATE
    ;
    CREATE FUNCTION LAST_DAY(D DATE)
    RETURNS???? DATE
    ??? SPECIFIC LAST_DAYDATE
    ??? LANGUAGE SQL
    ??? DETERMINISTIC
    ??? CONTAINS SQL
    ??? CALLED ON NULL INPUT
    ??? NO EXTERNAL ACTION
    ??? RETURN
    D + 1 month - day(D + 1 month) day

    ;

    同理,DB2下的first day:
    DROP SPECIFIC FUNCTION FIRST_DAYDATE
    ;
    CREATE FUNCTION FIRST_DAY(D DATE)
    RETURNS???? DATE
    ??? SPECIFIC FIRST_DAYDATE
    ??? LANGUAGE SQL
    ??? DETERMINISTIC
    ??? CONTAINS SQL
    ??? CALLED ON NULL INPUT
    ??? NO EXTERNAL ACTION
    ??? RETURN
    D - day(D) day + 1 day

    posted on 2006-11-14 11:27 扭轉乾坤 閱讀(718) 評論(0)  編輯  收藏 所屬分類: 數據庫類


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年11月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類(31)

    隨筆檔案(30)

    文章分類(32)

    文章檔案(33)

    相冊

    PHP小站-首頁

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩色视频一区二区三区亚洲| 国产av无码专区亚洲av桃花庵| 亚洲视频在线观看2018| 性色午夜视频免费男人的天堂| 亚洲av无码成h人动漫无遮挡 | 免费a级毛片18以上观看精品| 亚洲AV无码一区二区大桥未久| 免费毛片在线视频| 亚洲第一综合天堂另类专 | 本免费AV无码专区一区| 亚洲中文字幕久久精品无码APP| 亚洲精品视频免费观看| 亚洲午夜福利717| 日本免费中文视频| 亚洲综合视频在线观看| 114一级毛片免费| 亚洲欧美国产国产一区二区三区| 妞干网免费视频在线观看| 亚洲AV无码专区国产乱码不卡| 免费少妇a级毛片| 毛片免费在线观看| 亚洲图片校园春色| 日本特黄特色免费大片| 国产福利免费视频| 亚洲视频免费在线看| 噜噜嘿在线视频免费观看| 亚洲国产免费综合| 中文字幕在线观看亚洲| 免费无码成人AV片在线在线播放| 美女免费视频一区二区| 亚洲av色影在线| 永久免费bbbbbb视频| 两个人看的www免费视频| 亚洲图片激情小说| 亚洲国产精品成人| 最近免费2019中文字幕大全| 亚洲精品GV天堂无码男同| 亚洲精品白浆高清久久久久久 | 猫咪免费人成在线网站 | 91大神亚洲影视在线| 国产精品视频免费一区二区三区|