2017-05-03 155 views
0

我一直在努力与一个Oracle数据库的呼叫超过一天了。我必须比编程其它数据库不能访问,虽然DBA能够给我下面的:如何解决这个“PLS-00306:错误的数量或参数类型的调用...”

desc appowner.member_data_package 

PROCEDURE UPDATE_NOTES_V001 
Argument Name     Type     In/Out Default? 
------------------------------ ----------------------- ------ -------- 
TAU_UID_IN      VARCHAR2    IN 
INCOMING_FUNC_IN    VARCHAR2    IN 
INCOMING_TEXT_IN    VARCHAR2    IN 
SYS_SOURCE_IN     VARCHAR2    IN 
USER_ID_IN      VARCHAR2    IN 
O_STATUS      VARCHAR2    OUT 

我的代码如下所示:

using (var connection = new OracleConnection(connectionString)) 
{ 
    connection.Open(); 

    OracleCommand command = new OracleCommand 
    { 
     Connection = connection, 
     CommandType = CommandType.StoredProcedure, 
     CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001", 
     BindByName = true 
    }; 

    command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.ReturnValue)); 
    command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400"; 
    command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT"; 
    command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing."; 
    command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM"; 
    command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac"; 

    command.ExecuteNonQuery(); 
    Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'"); 

} 

当我运行此我得到的错误是:

ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'UPDATE_NOTES_V001' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

至于我可以告诉我有正确的数量和类型的参数,但如果有人比我更聪明,在O3方式racle(基本上就是任何人)都可以指出我搞砸的地方,那真是太棒了。

如果这部分看起来正确,错误是某种红鲱鱼,我还能看到什么?有没有其他的方式来调用这个过程?请记住,除Visual Studio 2017之外,我没有工具。我无法下载任何有用的扩展。除了发送给DBA的电子邮件外,我没有直接访问数据库的权限。

我也承认我可能在这里完全错误的粘性。我完全猜测,将值插入到Oracle数据库中的代码看起来像是基于我在此处和“网络”中看到的一些示例。任何建议来解决这个问题都会有所帮助。

+0

如果您在Oracle中传递参数,则需要按照在Oracle存储过程中声明的确切顺序传递它们。或将此'ParameterDirection.ReturnValue'更改为'ParameterDirection.OutPut'可以显示确切的Sql语句。 – MethodMan

+0

可以显示完整的过程以及SQL在哪里指定要返回的值..在执行INSERT时,期望在Oracle编号中返回值类型为INT,而INT不同,一个被转换为小数,而另一个是INTEGER ...我已经修复了类似的问题,实际上是昨晚 – MethodMan

+0

不幸的是,我不能显示步骤。从字面上看,我所要做的就是我上面提供的desc。 @MethodMan,我会认为proc会返回除varchar2之外的其他东西,但除非desc以某种方式不准确,否则它似乎是文本。 –

回答

2

对Oracle过程的调用需要与被调用过程的参数的类型和顺序相匹配。此外,返回值的参数是OutPut参数。您的代码与被调用过程的参数不匹配,因此出现错误。将其更改为:

using (var connection = new OracleConnection(connectionString)) 
{ 
connection.Open(); 

OracleCommand command = new OracleCommand 
{ 
    Connection = connection, 
    CommandType = CommandType.StoredProcedure, 
    CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001", 
    BindByName = true 
}; 

command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400"; 
command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT"; 
command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing."; 
command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM"; 
command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac"; 
command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.OutPut)); 

command.ExecuteNonQuery(); 
Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'"); 

} 
+0

出于某种原因,“ReturnValue”在“OutPut”中引起了我的一致。我并不关心订单,因为我认为“BindByName”会否定这样的事情(不确定为什么他们甚至需要这个名字,如果我把它们放在正确的顺序)。但是,这里的提示解决了我的问题。 –

+0

'command.Parameters.Add'的名称部分允许您通过名称调用该特定参数。这不是我用过的东西,但是如果你需要使用它,它就在那里。 –

相关问题