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

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

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

    飛翔的起點

    從這里出發

    導航

    <2008年4月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    統計

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    關于存儲過程(一)

    oracle 存儲過程的基本語法

     

     

    1.基本結構
    CREATE OR REPLACE PROCEDURE 存儲過程名字
    (
        參數1 IN NUMBER,
        參數2 IN NUMBER
    ) IS
    變量1 INTEGER :=0;
    變量2 DATE;
    BEGIN

    END 存儲過程名字

    2.SELECT INTO STATEMENT
      將select查詢的結果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條
      記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)
      例子:
      BEGIN
      SELECT col1,col2 into 變量1,變量2 FROM typestruct where xxx;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
          xxxx;
      END;
      ...

    3.IF 判斷
      IF V_TEST=1 THEN
        BEGIN
           do something
        END;
      END IF;

    4.while 循環
      WHILE V_TEST=1 LOOP
      BEGIN
     XXXX
      END;
      END LOOP;

    5.變量賦值
      V_TEST := 123;

    6.用for in 使用cursor
      ...
      IS
      CURSOR cur IS SELECT * FROM xxx;
      BEGIN
     FOR cur_result in cur LOOP
      BEGIN
       V_SUM :=cur_result.列名1+cur_result.列名2
      END;
     END LOOP;
      END;

    7.帶參數的cursor
      CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
      OPEN C_USER(變量值);
      LOOP
     FETCH C_USER INTO V_NAME;
     EXIT FETCH C_USER%NOTFOUND;
        do something
      END LOOP;
      CLOSE C_USER;

    8.用pl/sql developer debug
      連接數據庫后建立一個Test WINDOW
      在窗口輸入調用SP的代碼,F9開始debug,CTRL+N單步調試

    9、注意事項
     1.在oracle中,數據表別名不能加as,如:

    select a.appname from appinfo a;-- 正確
    select a.appname from appinfo as a;-- 錯誤
     也許,是怕和oracle中的存儲過程中的關鍵字as沖突的問題吧

    2.在存儲過程中,select某一字段時,后面必須緊跟into,如果select整個記錄,利用游標的話就另當別論了。

      select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正確編譯
      select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 沒有into,編譯報錯,提示:Compilation 
      Error: PLS-00428: an INTO clause is expected in this SELECT statement

    3.在利用select...into...語法時,必須先確保數據庫中有該條記錄,否則會報出"no data found"異常。

       可以在該語法之前,先利用select count(*) from 查看數據庫中是否存在該記錄,如果存在,再利用select...into...

    4.在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運行階段會報錯

     select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正確運行
    select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 運行階段報錯,提示
    ORA-01422:exact fetch returns more than requested number of rows

    5.在存儲過程中,關于出現null的問題

    假設有一個表A,定義如下:
    create table A(
    id 
    varchar2(50primary key not null,
    vcount 
    number(8not null,
    bid 
    varchar2(50not null -- 外鍵 
    );
    如果在存儲過程中,使用如下語句:
    select sum(vcount) into fcount from A where bid='xxxxxx';
    如果A表中不存在bid="xxxxxx"的記錄,則fcount=null(即使fcount定義時設置了默認值,如:fcount number(8):=0依然無效,fcount還是會變成null),這樣以后使用fcount時就可能有問題,所以在這里最好先判斷一下:
    if fcount is null then
        fcount:
    =0;
    end 
    if;
    這樣就一切ok了。

    6.Hibernate調用oracle存儲過程

            this.pnumberManager.getHibernateTemplate().execute(
                    
    new HibernateCallback() {
                        
    public Object doInHibernate(Session session)
                                
    throws HibernateException, SQLException {
                            CallableStatement cs 
    = session
                                    .connection()
                                    .prepareCall(
    "{call modifyapppnumber_remain(?)}");
                            cs.setString(
    1, foundationid);
                            cs.execute();
                            
    return null;
                        }

                    }
    );

    posted on 2008-04-14 15:57 forgood 閱讀(173) 評論(0)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲成AV人在线观看天堂无码| 亚洲AV电影院在线观看| 亚洲不卡在线观看| 国产在线精品一区免费香蕉| 亚洲喷奶水中文字幕电影| 永久免费毛片在线播放| 精品国产日韩亚洲一区在线| 亚洲电影在线免费观看| 无码人妻一区二区三区免费视频 | 日本免费一区二区三区| a在线视频免费观看| 亚洲欧美日韩中文高清www777| 久久久久亚洲av毛片大| 国产高潮久久免费观看| 亚洲AV人无码综合在线观看| 未满十八18禁止免费无码网站| 亚洲综合校园春色| 国产国产人免费人成免费视频| 一区二区在线免费视频| 亚洲伊人色一综合网| 亚洲日韩aⅴ在线视频| 日韩免费a级毛片无码a∨| 西西人体免费视频| 国产亚洲情侣久久精品| 午夜亚洲WWW湿好爽| 精品国产污污免费网站入口 | 日韩a毛片免费观看| 日韩精品亚洲专区在线影视| 亚洲人成无码网站在线观看| 亚洲人成网男女大片在线播放| 亚洲成人午夜在线| 久久丫精品国产亚洲av| 亚洲综合中文字幕无线码| 国产成+人+综合+亚洲专| 国产成人精品免费视频大全| 一级有奶水毛片免费看| 四虎1515hh永久久免费| 国产一级理论免费版| 久久亚洲国产视频| 日韩亚洲人成网站| 97人妻无码一区二区精品免费|