Oracle常見錯誤:ORA-01403 的根本原因和解決方案____Oracle

來源:互聯網
上載者:User
Oracle常見錯誤:ORA-01403

ORA-06512: 在 "MALL.PUB_YANG_LOGON_ORGAN", line 88
ORA-06512: 在 line 1

    at com.yangcq.flow.processflow.ProcessflowFunction.execute(ProcessflowFunction.java:102)
    at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:869)
    at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1042)
    at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:567)
    at com.yangcq.flow.processflow.BaseProcessflow.executeProcessflow(BaseProcessflow.java:65)
    at com.yangcq.flow.processflow.BaseProcessflow.executeProcessflow(BaseProcessflow.java:39)
    at com.yangcq.web.spring.DefaultFlowExecuteHandler.executeProcessflow(DefaultFlowExecuteHandler.java:58)
    at com.yangcq.service.ProcessflowExecuteService.execute(ProcessflowExecuteService.java:164)
    at com.yangcq.flow.processflow.function.ProcessflowExecFunction.exec(ProcessflowExecFunction.java:33)
    ... 48 more
Caused by: com.yangcq.Exception: root cause: SqlMapClient operation; SQL [];   
--- The error occurred in config/sqlmap/public.xml.  
--- The error occurred while applying a parameter map.  
--- Check the public.pwdErrorOperate.  
--- Check the statement (update procedure failed).  
--- Cause: java.sql.SQLException: ORA-01403: 未找到任何資料

88行的SQL是這樣的(為了便於閱讀,我把這行代碼進行了格式化,多行顯示):    
SELECT
    LCL_LASTFAIL,LCL_FAILTODAY INTO V_LASTDATE, V_FAILCOUNT
FROM
    CB_LOGON_CTRL
WHERE
    LCL_BRANCHID = IN_BRANCHID AND
    LCL_USERID = IN_CSTNO||IN_USERID;

根本原因:SELECT語句查詢出來的結果為空白,此時把查詢出來的空值賦給2個變數,就出現了上面這個錯誤。ORA-01403: 未找到任何資料,報這個錯誤
通常都是SELECT INTO 語句查詢結果為空白的原因。這個報錯是我們在使用PL/SQL進行調試時,經常遇到的一個問題。
解決方案:查看一下是不是資料的問題,導致查詢結果為空白。

如果我們使用Oracle的異常處理機制來捕獲這個異常的話,控制台就不會列印錯誤資訊了。

Oracle異常處理機制
為了開發和維護的方便,Oracle定義了常見的異常,主要有以下幾個:
1,DUP_VAL_ON_INDEX        異常碼 ORA-00001        試圖向唯一索引列插入重複值
2,INVALID_CURSOR        異常碼 ORA-01001        試圖進行非法遊標操作
3,INVALID_NUMBER        異常碼 ORA-01722        試圖將字串轉化成數字
4,NO_DATA_FOUND        異常碼 ORA-01403        SELECT INTO 語句中沒有任何返回結果
5,TOO_MANY_ROWS        異常碼 ORA-01422        SELECT INTO 語句中返回結果
6,ZERO_DIVIDE        異常碼 ORA-01476        試圖用0作為除數
7,CURSOR_ALREADY_OPEN        異常碼 ORA-06511        試圖開啟一個已經開啟的遊標

PL/SQL中用EXCEPTION關鍵字來作為異常的開始標誌。一旦一個預存程序發生異常,就會執行異常語句之後的SQL。

擴充閱讀:Oracle中的ROWNUM關鍵字
在查詢的結果集中,ROWNUM關鍵字為結果集中的每一行標識一個行號,第一行返回1,第二行返回2...,以此類推。通過ROWNUM關鍵字,我們可以控制查詢的記錄數。如下:
SELECT * FROM ENT_ROLE WHERE ROWNUM < 10;  --查詢ENT_ROLE中的前9條記錄
ROWNUM與ROWID的區別:ROWID是插入記錄時產生的,標識的是行的物理地址;ROWNUM是查詢資料時產生的,標識的是查詢結果中行的順序。
關於ROWNUM還有一點需要說明的就是,下面的寫法,不返回任何查詢結果:
SELECT * FROM ENT_ROLE WHERE ROWNUM > 10;
SELECT * FROM ENT_ROLE WHERE ROWNUM >= 10;

那麼Oracle如何?分頁呢。
--Oracle分頁查詢
SELECT
  *
FROM
  (
    SELECT
        ROWNUM R,YANGCQ_ID,YANGCQ_BRANCHID
    FROM
        YANGCQ_USER
    WHERE
        ROWNUM <= 10
    )
WHERE
    R > 5;
流程解析:第一步內部查詢得到ROWNUM ,並且起個別名R;然後外部查詢使用的R列,其實是內層查詢的一個列,而不是行的標號了。
同樣的,也可以採用類似的方法:
SELECT
  *
FROM
  (
    SELECT
        ROWNUM R,YANGCQ_ID,YANGCQ_BRANCHID
    FROM
        YANGCQ_USER
    )
WHERE
    R > 5 AND
    R <= 10;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.