Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将一个存储过程调用到另一个存储过程中_Sql_Oracle_Stored Procedures_Oracle Sqldeveloper - Fatal编程技术网

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参数@简,你必须给它下定义