2013-04-24 71 views
0

嗨返回字符串隱我有以下存儲過程...從Oracle SP

CREATE OR REPLACE PROCEDURE DB.INSERTGOOD 
(
--CapRefCursor OUT Cap_Cur_Pkg.CapCur, 
p_APPLIANT_TLT IN GOODRIGHT_MANUAL.APPLICANT_TLT%TYPE, 
p_APPLIANT_NME IN GOODRIGHT_MANUAL.APPLICANT_NME%TYPE, 
p_APPLICANT_SURNME IN GOODRIGHT_MANUAL.APPLICANT_SURNME%TYPE, 
p_COMPANY_NME IN GOODRIGHT_MANUAL.COMPANY_NME%TYPE, 
p_ID_CDE IN GOODRIGHT_MANUAL.ID_CDE%TYPE, 
p_ADD1 IN GOODRIGHT_MANUAL.ADD1%TYPE, 
p_OCCUPATION1 IN GOODRIGHT_MANUAL.OCCUPATION1%TYPE, 
p_REMARK1 IN GOODRIGHT_MANUAL.REMARK1%TYPE, 
p_SOURCE IN GOODRIGHT_MANUAL.SOURCE%TYPE 
) 
IS 
BEGIN 


INSERT 
INTO GOODRIGHT_MANUAL 
(
SEQ_ID, 
APPLICANT_TLT,  
APPLICANT_NME, 
APPLICANT_SURNME, 
COMPANY_NME, 
ID_CDE, 
ADD1,    
OCCUPATION1,    
REMARK1,    
GOODRIGHT_MANUAL.SOURCE    
) 
VALUES 
(
goodright_seq.nextval, 
p_APPLIANT_TLT, 
p_APPLIANT_NME, 
p_APPLICANT_SURNME, 
p_COMPANY_NME, 
lower(p_ID_CDE), 
p_ADD1, 
p_OCCUPATION1, 
p_REMARK1, 
p_SOURCE 
); 
COMMIT; 
-- OPEN CapRefCursor FOR 
--select 'True'; 
EXCEPTION 
WHEN DUP_VAL_ON_INDEX 
THEN ROLLBACK; 
-- select 'False'; 
END DB.INSERTGOOD; 
/

在這裏,我想返回一個字符串TRUE,如果交易成功,併爲FALSE事務回滾提交。
輸出變量CapRefCursor被定義,但我不知道如何爲該變量賦值true false並返回它。 在此先感謝。

回答

1

您已經定義了一個沒有參數OUT的過程,因此它不能返回任何內容。

您有幾種選擇返回成功信息:

  1. 定義一個函數,而不是一個過程。一個函數總是返回一些東西,你可以定義一個字符串,例如在你的情況下返回爲VARCHAR2
  2. 在程序中添加一個OUT參數。 OUT參數在邏輯上等同於函數返回值。你可以有多個這樣的參數。
  3. 修改您的邏輯,以便該過程在其工作時不返回任何內容,並在失敗時引發異常。

我會去與解決方案(3),因爲:

  • 溶液(1)和(2)是容易出錯的:你可以很容易忘記檢查返回代碼在你的程序將這種情況下,繼續好像沒有錯誤發生在失敗的情況下。忽略錯誤是將良性錯誤轉化爲怪物的最可靠的方式,因爲它可能導致大量的數據損壞。您的程序可能會持續數月,但您沒有意識到它會間歇性地失敗!
  • 異常邏輯旨在解決此問題,並使代碼更清晰和更清晰。 每個程序調用後都不會有更難看的if-then-else。僅僅因爲這個原因,解決方案(1)和(2)在被廣泛用於返回成功/錯誤狀態時被認爲是code-smell(反模式)。
  • 涉及的代碼較少,只是刪除EXCEPTION塊,並且讓錯誤傳播
  • 如果您讓異常傳播(並且不發出中間提交),則失敗的過程將爲undo their work without rolling back the whole transaction

最後,一般來說,你不應該控制你的子程序中的事務邏輯。執行單個插入的過程可能是較大事務的一部分。你不應該讓這個過程提交或回滾。您的調用代碼,無論是PL/SQL,GUI還是腳本都應該決定事務是否應前進並完成或回退。

+0

謝謝文森特我使用第三種方法,它確實工作... – 2013-04-24 10:25:52