2013-03-19 214 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

相关问题