我有一个程序,在我的一个表格中插入一行。
在程序中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
)
感谢您的帮助。
答案 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}}参数的程序。这往往暗示您没有正确使用异常并且您正在传递错误消息而不是在代码遇到错误时抛出异常。这实际上总是导致更脆弱的代码,比使用适当的异常时更难调试。