调用存储过程到另一个存储过程
我有一个过程,即将一行插入到我的表中。调用存储过程到另一个存储过程
在程序中插入后,我想找到所有的线到另一个表,然后,拨打第二个表的插入过程。
所以我都工作正常
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
)
感谢您的帮助。
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
的任何程序。这往往意味着你没有正确使用异常,并且你传递了错误消息而不是在代码遇到错误时抛出异常。这实际上总是会导致比使用适当的异常更难以调试的更脆弱的代码。
事实上,我之后将字符串转换回来,但这是因为在其他情况下我需要P_INSERT_TABLE2。所以我必须这样做。我使用异常,但pmessage可以是好的或错误的,所以我将它显示到我的silverlight视图(成功消息或失败消息)。这就是我使用OUT参数和Exception的原因。 – 2013-03-19 14:31:51
谢谢,现在工作正常。我在想,我不需要在通话中使用OUT参数。现在我会知道它。 – 2013-03-19 14:35:00
您可以添加P-INSERT-TABLE2的声明吗?顺便说一句:请不要在程序名称中使用“ - ” - 这非常令人困惑;我不认为这是你真正的代码,因为除非有适当的引用,否则表格名称和包含“ - ”的过程名称将不被Oracle接受。 – 2013-03-19 14:10:59
是的,代码太长了,所以我用C1等替换了名称colum ...和表名和过程与通用名称。 – 2013-03-19 14:15:52
你的OUT参数如何?您是否在从P_INSERT_TABLE1打电话时发送该邮件? – 2013-03-19 14:16:56