IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)Oracle → oracle存儲(chǔ)過(guò)程的基本語(yǔ)法及注意事項(xiàng)

oracle存儲(chǔ)過(guò)程的基本語(yǔ)法及注意事項(xiàng)

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

  1.基本結(jié)構(gòu)

  CREATE OR REPLACE PROCEDURE 存儲(chǔ)過(guò)程名字

  (

  參數(shù)1 IN NUMBER,

  參數(shù)2 IN NUMBER

  ) IS

  變量1 INTEGER :=0;

  變量2 DATE;

  BEGIN

  END 存儲(chǔ)過(guò)程名字

  2.SELECT INTO STATEMENT

  將select查詢的結(jié)果存入到變量中,可以同時(shí)將多個(gè)列存儲(chǔ)多個(gè)變量中,必須有一條

  記錄,否則拋出異常(如果沒(méi)有記錄拋出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 循環(huán)

  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.帶參數(shù)的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

  連接數(shù)據(jù)庫(kù)后建立一個(gè)Test WINDOW

  在窗口輸入調(diào)用SP的代碼,F9開始debug,CTRL+N單步調(diào)試

  關(guān)于oracle存儲(chǔ)過(guò)程的若干問(wèn)題備忘

  1.在oracle中,數(shù)據(jù)表別名不能加as,如:

  select a.appname from appinfo a;-- 正確

  select a.appname from appinfo as a;-- 錯(cuò)誤

  也許,是怕和oracle中的存儲(chǔ)過(guò)程中的關(guān)鍵字as沖突的問(wèn)題吧

  2.在存儲(chǔ)過(guò)程中,select某一字段時(shí),后面必須緊跟into,如果select整個(gè)記錄,利用游標(biāo)的話就另當(dāng)別論了。

  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;-- 沒(méi)有into,編譯報(bào)錯(cuò),提示:Compilation

  Error: PLS-00428: an INTO clause is expected in this SELECT statement

  3.在利用select...into...語(yǔ)法時(shí),必須先確保數(shù)據(jù)庫(kù)中有該條記錄,否則會(huì)報(bào)出"no data found"異常。

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

  4.在存儲(chǔ)過(guò)程中,別名不能和字段名稱相同,否則雖然編譯可以通過(guò),但在運(yùn)行階段會(huì)報(bào)錯(cuò)

  select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正確運(yùn)行

  select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 運(yùn)行階段報(bào)錯(cuò),提示

  ORA-01422:exact fetch returns more than requested number of rows

  5.在存儲(chǔ)過(guò)程中,關(guān)于出現(xiàn)null的問(wèn)題

  假設(shè)有一個(gè)表A,定義如下:

  create table A(

  id varchar2(50) primary key not null,

  vcount number(8) not null,

  bid varchar2(50) not null -- 外鍵

  );

  如果在存儲(chǔ)過(guò)程中,使用如下語(yǔ)句:

  select sum(vcount) into fcount from A where bid='xxxxxx';

  如果A表中不存在bid="xxxxxx"的記錄,則fcount=null(即使fcount定義時(shí)設(shè)置了默認(rèn)值,如:fcount number(8):=0依然無(wú)效,fcount還是會(huì)變成null),這樣以后使用fcount時(shí)就可能有問(wèn)題,所以在這里最好先判斷一下:

  if fcount is null then

  fcount:=0;

  end if;

  這樣就一切ok了。

  6.Hibernate調(diào)用oracle存儲(chǔ)過(guò)程

  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;

  }

  });

關(guān)鍵詞標(biāo)簽:oracle,存儲(chǔ)過(guò)程

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法