首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 預存程序開發避坑指南:六大常見問題備忘

     編輯:Oracle 資料庫相關知識

1. 表別名不可用 AS

SELECT a.appname FROM appinfo a;       -- 正確
SELECT a.appname FROM appinfo AS a;    -- 錯誤

疑為避免與 PL/SQL 關鍵字 AS 衝突。

2. SELECT INTO 強制要求

預存程序中 SELECT 單一欄位必須緊接 INTO;若選整列則使用游標。

SELECT af.keynode INTO kn FROM appfoundation af ...;  -- 正確
SELECT af.keynode FROM appfoundation af ...;          -- 編譯錯:PLS-00428

3. SELECT INTO 前必須確認資料存在

若查無資料會拋出 NO_DATA_FOUND 例外。建議先 SELECT COUNT(*) 確認存在再執行 SELECT INTO。

4. 別名不可與欄位名同名

編譯雖通過,執行期會報 ORA-01422: exact fetch returns more than requested number of rows。
錯誤範例:SELECT af.keynode INTO kn FROM appfoundation af WHERE af.appid = appid ...(別名 af 與欄位 appid 同名導致條件失效)。

5. 聚合函數回傳 NULL 處理

表 A 定義 vcount NOT NULL,但 SELECT SUM(vcount) INTO fcount FROM A WHERE bid='xxx' 若無符合行,fcount 為 NULL(即使宣告 fcount NUMBER(8) := 0 也會被覆蓋)。必須事後判斷:

IF fcount IS NULL THEN fcount := 0; END IF;

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;
    }
  });
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved