<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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 国产成人va亚洲电影| 亚洲成人动漫在线观看| 亚洲人成电影网站免费| 100000免费啪啪18免进| 亚洲国产成人久久99精品| 午夜网站在线观看免费完整高清观看| 久久精品国产69国产精品亚洲| 两个人看的www免费视频| 国产日产亚洲系列| 99久久国产精品免费一区二区| 亚洲欧洲日产国码无码久久99| 91视频免费网站| 久久久久久亚洲av成人无码国产| 91精品啪在线观看国产线免费| 久久久久久亚洲精品| 国产国产人免费视频成69堂| 亚洲av永久综合在线观看尤物| 特级做A爰片毛片免费69| 亚洲欧美日韩中文字幕一区二区三区 | 午夜视频在线在免费| 精品国产日韩亚洲一区91| 亚洲国产一级在线观看| 色www永久免费网站| 亚洲成人一级电影| 大学生高清一级毛片免费| 麻豆一区二区三区蜜桃免费| 久久久久亚洲av毛片大| 99re这里有免费视频精品| 亚洲一卡二卡三卡| 免费成人午夜视频| 免费av一区二区三区| 亚洲伊人久久大香线蕉影院| 国产嫩草影院精品免费网址| baoyu777永久免费视频 | 亚洲人成人无码.www石榴| 亚洲AⅤ优女AV综合久久久| 免费人成黄页在线观看日本| 亚洲一级毛片在线观| 久久乐国产精品亚洲综合| ww4545四虎永久免费地址| 特黄特色大片免费|