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 的所有“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  
) 

感谢您的帮助。

4

1 回答 1

3

的声明P_INSERT_TABLE2无效。您不能将 5 个输入参数全部命名为pi_C4. 由于您在创建该过程时没有遇到编译错误,我猜这是一个在此处发布问题时引入的错误,而不是代码中实际存在的问题。

根据 的声明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将转身并将字符串转换回日期,这意味着您正在做额外的工作并引入了转换可能失败的额外点,或者您将编写一个字符串表示日期到一张桌子。这些影响都不好。

我也非常怀疑任何具有OUT名为pMessage. 这往往意味着您没有正确使用异常,并且如果您的代码遇到错误,您将返回错误消息而不是抛出异常。与使用适当的异常相比,这实际上总是会导致更脆弱的代码更难调试。

于 2013-03-19T14:24:04.533 回答