Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
C# 如何从C调用Oracle过程#_C#_Sql_.net_Oracle_Plsqldeveloper - Fatal编程技术网

C# 如何从C调用Oracle过程#

C# 如何从C调用Oracle过程#,c#,sql,.net,oracle,plsqldeveloper,C#,Sql,.net,Oracle,Plsqldeveloper,从C#代码中,我试图从Oracle调用一个PACKAGE.PROCEDURE()。在这个简单的示例中,我应该从过程调用中获得一个值,但得到的只是错误: 调用“RETURN_NUM”时参数的数目或类型错误 程序声明如下: PROCEDURE return_num(xNum OUT NUMBER) AS BEGIN xNum:= 50; dbms_output.put_line('hello world ' || xNum); END; C#代码: 有人能指出我做错了什么吗

从C#代码中,我试图从Oracle调用一个PACKAGE.PROCEDURE()。在这个简单的示例中,我应该从过程调用中获得一个值,但得到的只是错误:

调用“RETURN_NUM”时参数的数目或类型错误

程序声明如下:

PROCEDURE return_num(xNum OUT NUMBER) AS
  BEGIN
    xNum:= 50;
    dbms_output.put_line('hello world ' || xNum);
  END;
C#代码:

有人能指出我做错了什么吗。然后在实际场景中,我想调用一个过程,从自定义类型返回一组值,例如:

TYPE r_interface_data IS RECORD
    (
     object_id             VARCHAR2(16),     
     obj_type              VARCHAR2(32)
    );

    TYPE t_interfase_data IS TABLE OF r_interface_data;
我怎样才能做到这一点。谢谢

更新:在我的特殊情况下,我最终采用了以下方法

using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name"))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlManager sqlManager = new SqlManager();
                    return sqlManager.GetDataSet(cmd);
                }

我不认为你有那么远。。。试试这个:

OracleCommand cmd = new OracleCommand("return_num", Oraclecon);
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal,
    ParameterDirection.Output));
cmd.CommandType = CommandType.StoredProcedure;

cmd.ExecuteNonQuery();
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value;
double result = d.ToDouble();
result
现在包含过程中的out参数

我认为您的问题是您试图在存储过程上使用
DbDataReader
DbDataReader
用于查询


另外,我使用了ODP.net——这可能是也可能不是导致您的问题的原因,您使用的是Ole。

我认为您离此不远。。。试试这个:

OracleCommand cmd = new OracleCommand("return_num", Oraclecon);
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal,
    ParameterDirection.Output));
cmd.CommandType = CommandType.StoredProcedure;

cmd.ExecuteNonQuery();
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value;
double result = d.ToDouble();
result
现在包含过程中的out参数

我认为您的问题是您试图在存储过程上使用
DbDataReader
DbDataReader
用于查询


另外,我使用了ODP.net——这可能也可能没有导致您的问题,您使用的是Ole。

UPDATE:因此,如果我指定参数的输出方向(查看下面的代码),那么我的代码将编译;但我没有收到任何数据
myCMD.Parameters.Add(“xNum”,OleDbType.Numeric).Direction=ParameterDirection.Output有什么想法吗?更新:如果我指定参数的输出方向(查看下面的代码),那么我的代码将编译;但我没有收到任何数据
myCMD.Parameters.Add(“xNum”,OleDbType.Numeric).Direction=ParameterDirection.Output有什么想法吗?谢谢你的回复@Hambone。在我的特殊情况下,我最终使用了以下方法。。。有关您的回复,请参见UpdateAnks@Hambone。在我的特殊情况下,我最终使用了以下方法。。。请参阅更新