2010-03-25 83 views
0

我已经习惯了SQL Server,因此一直在努力。我有下面的代码,我已经验证了OracleDbType是正确的,并已验证传递给参数的实际值是否匹配。我认为我的问题可能与返回值有关。它所做的就是给我行数。我在某处读到返回参数必须设置在顶部。我得到特定的错误说,如何使用ASP.NET和Oracle数据提供程序处理Oracle存储过程?

PLS-00306:错号码或类型的呼叫参数\ u0027INSERT_REC \ u0027
ORA-06550:第1行,第7列:\ NPL/SQL:语句被忽略

存储过程是:

PROCEDURE INSERT_REC 
(
    A_MILL_CENTER  IN GRO_OWNER.MOVEMENT.MILL_CENTER%TYPE,  --# VARCHAR2(10) 
    A_INGREDIENT_CODE IN GRO_OWNER.MOVEMENT.INGREDIENT_CODE%TYPE, --# VARCHAR2(50) 
    A_FEED_CODE  IN GRO_OWNER.MOVEMENT.FEED_CODE%TYPE,  --# VARCHAR2(30) 
    --# A_MOVEMENT_TYPE should be ‘RECEIPT’ for ingredient receipts 
    A_MOVEMENT_TYPE IN GRO_OWNER.MOVEMENT.MOVEMENT_TYPE%TYPE, --# VARCHAR2(10) 
    A_MOVEMENT_DATE IN VARCHAR2,        --# VARCHAR2(10) 
    A_MOVEMENT_QTY IN GRO_OWNER.MOVEMENT.MOVEMENT_QTY%TYPE, --# NUMBER(12,4) 
    --# A_INVENTORY_TYPE should be ‘INGREDIENT’ or ‘FINISHED’ 
    A_INVENTORY_TYPE IN GRO_OWNER.MOVEMENT.INVENTORY_TYPE%TYPE, --# VARCHAR2(10) 
    A_CREATE_USERID IN GRO_OWNER.MOVEMENT.CREATE_USERID%TYPE, --# VARCHAR2(20) 
    A_RETURN_VALUE OUT NUMBER         --# NUMBER(10,0) 
); 

我的代码如下:

for (int i=0; i < theData.Length -1; i+=3) 
       { 
//3 items hardcoded for now 

string millCenter = "0010260510"; 
string movementType = "RECEIPT"; 
string feedCode = "test this"; 
string userID = "GRIMMETTM"; 
string inventoryType = "INGREDIENT"; //set to FINISHED for feed stuff 
string movementDate = theData[i]; 
string ingCode = System.Text.RegularExpressions.Regex.Match(
     theData[i + 1], @"^([0-9]*)").ToString(); 
//int pounds = Convert.ToInt32(theData[i + 2].Replace(",", "")); 
int pounds = 100; 

//setup parameters 

OracleParameter p9 = 
    new OracleParameter("A_RETURN_VALUE", OracleDbType.Int32, 30); 
p9.Direction = ParameterDirection.ReturnValue; 
oraCmd.Parameters.Add(p9); 

OracleParameter p1 = 
    new OracleParameter("A_MILL_CENTER", OracleDbType.Varchar2, 10); 
p1.Direction = ParameterDirection.Input; 
p1.Value = millCenter; 
oraCmd.Parameters.Add(p1); 

OracleParameter p2 = 
    new OracleParameter("A_INGREDIENT_CODE", OracleDbType.Varchar2, 50); 
p2.Direction = ParameterDirection.Input; 
p2.Value = ingCode; 
oraCmd.Parameters.Add(p2); 

OracleParameter p3 = 
    new OracleParameter("A_FEED_CODE", OracleDbType.Varchar2, 30); 
p3.Direction = ParameterDirection.Input; 
p3.Value = feedCode; 
oraCmd.Parameters.Add(p3); 

OracleParameter p4 = 
    new OracleParameter("A_MOVEMENT_TYPE", OracleDbType.Varchar2, 10); 
p4.Direction = ParameterDirection.Input; 
p4.Value = movementType; 
oraCmd.Parameters.Add(p4); 

OracleParameter p5 = 
    new OracleParameter("A_MOVEMENT_DATE", OracleDbType.Varchar2, 10); 
p5.Direction = ParameterDirection.Input; 
p5.Value = movementDate; 
oraCmd.Parameters.Add(p5); 

OracleParameter p6 = 
    new OracleParameter("A_MOVEMENT_QTY", OracleDbType.Int32, 12); 
p6.Direction = ParameterDirection.Input; 
p6.Value = pounds; 
oraCmd.Parameters.Add(p6); 

OracleParameter p7 = 
    new OracleParameter("A_INVENTORY_TYPE", OracleDbType.Varchar2, 10); 
p7.Direction = ParameterDirection.Input; 
p7.Value = inventoryType; 
oraCmd.Parameters.Add(p7); 

OracleParameter p8 = 
    new OracleParameter("A_CREATE_USERID", OracleDbType.Varchar2, 20); 
p8.Direction = ParameterDirection.Input; 
p8.Value = userID; 
oraCmd.Parameters.Add(p8); 


//open and execute 
oraConn.Open(); 
oraCmd.ExecuteNonQuery(); 
oraConn.Close(); 
+0

@Matt:我重新格式化了你的代码,以避免水平滚动条,并使PL/SQL看起来有效。请检查您是否同意我的更改。 – 2010-03-25 14:44:36

+0

我忽略了一个重要的信息:这个对存储过程的调用是在for循环中。第一次执行完成,第二次执行失败。我会更新我的代码以反映循环。 – Matt 2010-03-25 15:02:13

回答

0

ParameterDirection为A_RETURN_VALUE应该ParameterDirection.Output

+0

仍然会得到相同的错误信息。 – Matt 2010-03-25 14:49:41

+1

尝试使用“蛮力” - 创建存储过程,根本没有参数,测试,然后开始逐个添加,直到失败。 – user38123 2010-03-25 14:53:42

+0

请参阅我上面的编辑。 – Matt 2010-03-25 15:03:36

0

您是否尝试过最后一次添加RETURN_VALUE参数而不是第一次?如果我记得,通过Oracle提供者调用Oracle存储过程时,参数必须以完全相同的顺序排列。

+0

是的,我已经尝试了这一点,以及像其他建议一样将ParameterDirection更改为Output。 – Matt 2010-03-25 14:49:25

+0

请看我上面编辑 – Matt 2010-03-25 15:04:12

0

无法从你的样品出来,但会不会是你声明的for循环范围之外oraCmd对象?我没有看到示例中的声明,但如果是这种情况,那么每次迭代都会将所有Oracle参数添加到数组中,并且在第一次之后的任何运行中都会有太多次。