簡體   English   中英

調用一個存儲過程,進入另一個存儲過程

[英]Call a stored procedure, into another stored procedure

我有一個過程,將一行插入到我的表之一。

在該過程中執行INSERT之后,我想在另一個表中找到所有行,然后調用第二個表的插入過程。

所以我有所有可以正常工作的第一個程序

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的所有“ in參數”都是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的in參數之一。

所以現在,我收到此錯誤消息:

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  
) 

感謝您的幫助。

P_INSERT_TABLE2的聲明無效。 您不能擁有全部名為pi_C4 5個輸入參數。 由於您在創建該過程時沒有遇到編譯錯誤,因此我想這是一個引入的錯誤,而不是代碼中實際存在的錯誤。

根據P_INSERT_TABLE2的聲明,該過程采用7個輸入參數和1個輸出參數。 在發布的代碼中,您似乎傳入了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將轉過來並將字符串轉換回日期,這意味着您正在做額外的工作並引入了轉換可能失敗的其他點,或者您打算編寫字符串的表示形式。表上的日期。 這些暗示都不是好事。

對於具有名為pMessageOUT參數的任何過程,我也非常懷疑。 這往往意味着您沒有正確使用異常,並且您正在傳回錯誤消息,而不是在代碼遇到錯誤時拋出異常。 實際上,這總是導致脆性更大的代碼,比使用適當的異常時,調試起來要困難得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM