Sql 将一个存储过程调用到另一个存储过程中
我有一个程序,在我的一个表中插入一行 在插入过程之后,我想找到另一个表中的所有行,然后调用第二个表的插入过程 因此,我有所有的第一个程序,工作良好Sql 将一个存储过程调用到另一个存储过程中,sql,oracle,stored-procedures,oracle-sqldeveloper,Sql,Oracle,Stored Procedures,Oracle Sqldeveloper,我有一个程序,在我的一个表中插入一行 在插入过程之后,我想找到另一个表中的所有行,然后调用第二个表的插入过程 因此,我有所有的第一个程序,工作良好 P_INSERT_TABLE1 INSERT INTO TABLE1 ... COMMIT; FOR record_po IN (SELECT C3, ... FROM T_TABLE2 WHERE id = v_id) LOOP P_INSERT_TA
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不接受参数,而所有的好类型都在良好的顺序中
如果调用类似“调用p\u INSERT\u 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
)
谢谢您的帮助。表2的
p\u INSERT\u声明无效。不能有5个输入参数全部命名为pi\u 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>> );
P\u插入表2(pi\u id,
记录_po.C3,
记录_po.C4,
第5号记录,
记录_po.C6,
记录_po.C7,
至_char(记录_po.C8,'DD/MM/YYYY'),
);
除了语法错误,当我看到有人将一个非常好的日期
转换为字符串,然后将其传递给过程时,我非常怀疑。这意味着,P_INSERT_TABLE2
将改变方向并将字符串转换回日期,这意味着您正在做额外的工作,并引入了转换可能失败的其他点,或者您将把日期的字符串表示形式写入表中。这两种暗示都不好
我还高度怀疑任何具有名为pMessage
的OUT
参数的过程。这往往意味着您没有正确地使用异常,并且如果代码遇到错误,您是在传递错误消息,而不是抛出异常。实际上,这总是会导致更脆弱的代码,比使用适当的异常时更难调试。p\u INSERT\u table 2的声明是无效的。不能有5个输入参数全部命名为pi\u 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>> );
P\u插入表2(pi\u id,
记录_po.C3,
记录_po.C4,
第5号记录,
记录_po.C6,
记录_po.C7,
至_char(记录_po.C8,'DD/MM/YYYY'),
);
除了语法错误,当我看到有人将一个非常好的日期
转换为字符串,然后将其传递给过程时,我非常怀疑。这意味着,P_INSERT_TABLE2
将改变方向并将字符串转换回日期,这意味着您正在做额外的工作,并引入了转换可能失败的其他点,或者您将把日期的字符串表示形式写入表中。这两种暗示都不好
我还高度怀疑任何具有名为pMessage
的OUT
参数的过程。这往往意味着您没有正确地使用异常,并且如果代码遇到错误,您是在传递错误消息,而不是抛出异常。这实际上总是导致更脆弱的代码,比使用适当的异常更难调试。请添加p-INSERT-TABLE2的声明好吗?顺便说一句:请不要在过程名称中使用“-”,这非常令人困惑;我不相信这是您真正的代码,因为Oracle不会接受包含“-”的表名和过程名,除非正确引用。是的,代码太长,所以我用C1等替换名称colum。。。表名和过程的泛型名称。OUT参数如何?当你从P_INSERT_TABLE1打电话时,你会发送吗?我还有P_INSERT_TABLE1的out参数。它不叫。我只是在里面放了一段文字。在P_INSERT_TABLE2中,我有7个IN参数,当我调用它时,我给出了7个IN参数@Jean您必须在P_INSERT_TABLE2的函数调用中定义它,而不管您是否要实际使用它。请添加P-INSERT-TABLE2的声明,好吗?顺便说一句:请不要在过程名称中使用“-”,这非常令人困惑;我不相信这是您真正的代码,因为Oracle不会接受包含“-”的表名和过程名,除非正确引用。是的,代码太长,所以我用C1等替换名称colum。。。表名和过程的泛型名称。OUT参数如何?当你从P_INSERT_TABLE1打电话时,你会发送吗?我还有P_INSERT_TABLE1的out参数。它不叫。我只是在里面放了一段文字。在P_INSERT_TABLE2中,我有7个IN参数,当我调用它时,我给出了7个IN参数@简,你必须给它下定义