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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 存储过程的基本语法 及注意事项

發布時間:2024/9/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 存储过程的基本语法 及注意事项 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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單步調試

關于oracle存儲過程的若干問題備忘

1.在oracle中,數據表別名不能加as,如: selecta.appname?fromappinfo?a;--正確selecta.appname?fromappinfo?asa;--錯誤 ?也許,是怕和oracle中的存儲過程中的關鍵字as沖突的問題吧 2.在存儲過程中,select某一字段時,后面必須緊跟into,如果select整個記錄,利用游標的話就另當別論了。 selectaf.keynode?intokn?fromAPPFOUNDATION?af?whereaf.appid=aid?andaf.foundationid=fid;--有into,正確編譯selectaf.keynode?fromAPPFOUNDATION?af?whereaf.appid=aid?andaf.foundationid=fid;--沒有into,編譯報錯,提示:Compilation?Error:?PLS-00428:?an?INTOclause?isexpected?inthis?SELECTstatement 3.在利用select...into...語法時,必須先確保數據庫中有該條記錄,否則會報出"no data found"異常。可以在該語法之前,先利用select count(*) from 查看數據庫中是否存在該記錄,如果存在,再利用select...into... 4.在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運行階段會報錯 selectkeynode?intokn?fromAPPFOUNDATION?whereappid=aid?andfoundationid=fid;--正確運行selectaf.keynode?intokn?fromAPPFOUNDATION?af?whereaf.appid=appid?andaf.foundationid=foundationid;--運行階段報錯,提示ORA-01422:exact?fetchreturnsmore?than?requested?numberofrows 5.在存儲過程中,關于出現null的問題假設有一個表A,定義如下: createtableA(id?varchar2(50)?primarykeynotnull,vcount?number(8)?notnull,bid?varchar2(50)?notnull--外鍵?); 如果在存儲過程中,使用如下語句: select?sum(vcount)?into?fcount?from?A?wherebid='xxxxxx'; 如果A表中不存在bid="xxxxxx"的記錄,則fcount=null(即使fcount定義時設置了默認值,如:fcount number(8):=0依然無效,fcount還是會變成null),這樣以后使用fcount時就可能有問題,所以在這里最好先判斷一下: iffcount?isnullthen????fcount:=0;end?if; 這樣就一切ok了。 6.Hibernate調用oracle存儲過程 this.pnumberManager.getHibernateTemplate().execute(????????????????newHibernateCallback()?...{????????????????????public?Object?doInHibernate(Session?session)????????????????????????????throws?HibernateException,?SQLException?...{????????????????????????CallableStatement?cs?=?session????????????????????????????????.connection()????????????????????????????????.prepareCall("{call?modifyapppnumber_remain(?)}");????????????????????????cs.setString(1,?foundationid);????????????????????????cs.execute();????????????????????????return?null;????????????????????}????????????????});

總結

以上是生活随笔為你收集整理的oracle 存储过程的基本语法 及注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。