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中的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;