将存储过程调用到另一个存储过程中

时间:2013-03-19 13:53:05

标签: sql oracle stored-procedures oracle-sqldeveloper

我有一个程序,在我的一个表格中插入一行。

在程序中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的所有“参数”都是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  
) 

感谢您的帮助。

1 个答案:

答案 0 :(得分: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的{​​{1}}参数的程序。这往往暗示您没有正确使用异常并且您正在传递错误消息而不是在代码遇到错误时抛出异常。这实际上总是导致更脆弱的代码,比使用适当的异常时更难调试。