2013-03-19 222 views
0

我有一個過程,即將一行插入到我的表中。調用存儲過程到另一個存儲過程

在程序中插入後,我想找到所有的線到另一個表,然後,撥打第二個表的插入過程。

所以我都工作正常

P_INSERT_TABLE1 

INSERT INTO TABLE1 

... 
COMMIT; 

FOR record_po IN (SELECT C3, ... 
        FROM T_TABLE2 
        WHERE id = v_id) 
LOOP 
     P_INSERT_TABLE2(record_po.C3, ...); 
END LOOP; 

所有「在參數」 P_INSERT_TABLE2的VARCHAR2第一個過程,所以我做的每一列一個「TO_CHAR」不是VARCHAR2:

P_INSERT_TABLE2(pi_id, 
         record_po.C3, 
         record_po.C4, 
         record_po.C5, 
         record_po.C6, 
         record_po.C7, 
         to_char(record_po.C8, 'DD/MM/YYYY'); 

這裏,pi_id是VARCHAR2中P_INSERT_TABLE1的參數之一。

所以,現在,我有這樣的錯誤消息:

Erreur(357,1): PLS-00306: number or args types wrong in the call of P_INSERT_TABLE2 

我不明白,爲什麼P_INSERT_TABLE2不接受參數,同時也有所有的好類型的良好秩序?

如果我把喜歡的程序「call P_INSERT_TABLE2(...)」我有這樣一個錯誤:

Erreur(357,9): PLS-00103: Symbol "P_INSERT_TABLE2" instead one of this symbols :  := . (@ % ; immediate Symbole ":=" 

create or replace 
PROCEDURE P_INSERT_TABLE2 (
    pi_id   IN VARCHAR2 
    ,pi_C3   IN VARCHAR2 
    ,pi_C4   IN VARCHAR2 
    ,pi_C5   IN VARCHAR2 
    ,pi_C6   IN VARCHAR2 
    ,pi_C7   IN VARCHAR2 
    ,pi_C8   IN VARCHAR2 
    ,pmessage  OUT NOCOPY VARCHAR2 
) 

感謝您的幫助。

+0

您可以添加P-INSERT-TABLE2的聲明嗎?順便說一句:請不要在程序名稱中使用「 - 」 - 這非常令人困惑;我不認爲這是你真正的代碼,因爲除非有適當的引用,否則表格名稱和包含「 - 」的過程名稱將不被Oracle接受。 – 2013-03-19 14:10:59

+0

是的,代碼太長了,所以我用C1等替換了名稱colum ...和表名和過程與通用名稱。 – 2013-03-19 14:15:52

+2

你的OUT參數如何?您是否在從P_INSERT_TABLE1打電話時發送該郵件? – 2013-03-19 14:16:56

回答

3

P_INSERT_TABLE2的聲明無效。你不能有5個輸入參數,全部命名爲pi_C4。由於創建該過程時沒有收到編譯錯誤,因此我猜測這是一個引入此問題的錯誤,而不是實際在代碼中出現的錯誤。

P_INSERT_TABLE2聲明,該過程需要7個輸入參數和一個輸出參數。在您發佈的代碼中,您似乎傳遞了7個輸入參數,但未傳入輸出參數的變量。看來,你需要像

P_INSERT_TABLE2(pi_id, 
       record_po.C3, 
       record_po.C4, 
       record_po.C5, 
       record_po.C6, 
       record_po.C7, 
       to_char(record_po.C8, 'DD/MM/YYYY'), 
       <<some local variable for the output parameter>>); 

除了語法錯誤,我非常懷疑,當我看到有人採取一個非常好的DATE,它強制轉換爲字符串,然後把它們遞過來的過程。這意味着要麼P_INSERT_TABLE2即將轉身並將字符串轉換回日期,這意味着您正在做額外的工作,並且已經引入了轉換可能失敗的附加點,或者您將編寫字符串表示形式一個表格的日期。這些影響都不好。

我也非常懷疑有OUT參數pMessage的任何程序。這往往意味着你沒有正確使用異常,並且你傳遞了錯誤消息而不是在代碼遇到錯誤時拋出異常。這實際上總是會導致比使用適當的異常更難以調試的更脆弱的代碼。

+0

事實上,我之後將字符串轉換回來,但這是因爲在其他情況下我需要P_INSERT_TABLE2。所以我必須這樣做。我使用異常,但pmessage可以是好的或錯誤的,所以我將它顯示到我的silverlight視圖(成功消息或失敗消息)。這就是我使用OUT參數和Exception的原因。 – 2013-03-19 14:31:51

+0

謝謝,現在工作正常。我在想,我不需要在通話中使用OUT參數。現在我會知道它。 – 2013-03-19 14:35:00

相關問題