gpt4 book ai didi

oracle - 如何从 C# 调用带有 Ref Cursor 作为 Out 参数的 Oracle 函数?

转载 作者:行者123 更新时间:2023-12-04 14:05:26 46 4
gpt4 key购买 nike

我正在使用提供基于 Oracle 函数的数据库 API 的产品,并且通常我能够通过 ODP.NET 调用函数。但是,我不知道如何调用包含 Ref Cursor 作为 Out 参数的函数。到目前为止,我发现的所有样本要么调用带有 Out 参数的过程,要么调用带有 Ref Cursor 作为返回值的函数。我试图以类似的方式定义参数,但不断收到错误提供的参数数量或类型错误。

这是函数头(显然是混淆的):

FUNCTION GetXYZ(
uniqueId IN somepackage.Number_Type,
resultItems OUT somepackage.Ref_Type)
RETURN somepackage.Error_Type;

这些是“somepackage”中的类型定义:
SUBTYPE Number_Type IS NUMBER(13);
TYPE Ref_Type IS REF CURSOR;
SUBTYPE Error_Type IS NUMBER;

这是我尝试过的代码:
string sql = "otherpackage.GetXYZ";
var getXYZCmd = OracleCommand oracleConnection.CreateCommand(sql);
getXYZCmd.CommandType = CommandType.StoredProcedure;

getXYZCmd.Parameters.Add("uniqueId", OracleDbType.Int32).Value = uniqueExplosionId;
getXYZCmd.Parameters.Add("resultItems", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
getXYZCmd.Parameters.Add("return_value", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue;

我尝试了以下不同的方法来调用函数(当然一次只能调用一种):
var result = getXYZCmd.ExecuteNonQuery();
var reader = getXYZCmd.ExecuteReader();
var scalarResult = getXYZCmd.ExecuteScalar();

但他们每个人都失败并显示错误消息:
Oracle.DataAccess.Client.OracleException: ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'GETXYZ'
ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'GETXYZ'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored.

那么通常是否可以使用 ODP.NET 从 C# 调用带有 Ref Cursor 作为 Out 参数的函数?我可以使用 Varchar2-Out 参数而不是 Ref Cursor 调用具有相同结构的函数而不会出现问题......

顺便说一句,我在 Visual Studio 2008 中使用来自 C#.NET 3.5 的 ODP.NET 版本 2.112.2.0。

在此先感谢您的帮助!

最佳答案

你肯定可以。有一些问题需要注意,但这里有一个测试用例

create or replace function testodpRefCursor(
uniqueId IN NUMBER
,resultItems OUT NOCOPY SYS_REFCURSOR) RETURN NUMBER
IS

BEGIN
OPEN resultItems for select level from dual connect by level < uniqueId ;
return 1;
END testodpRefCursor;
  • 我发现
    函数喜欢有
    返回值为 THE FIRST参数
    收藏中
  • BindByName 默认为 FALSE,因此默认为 BIND BY POSITION

  • 否则它很简单:
      OracleCommand cmd = new OracleCommand("TESTODPREFCURSOR", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.BindByName = true;
    // Bind


    OracleParameter oparam = cmd.Parameters.Add("ReturnValue", OracleDbType.Int64);
    oparam.Direction = ParameterDirection.ReturnValue ;

    OracleParameter oparam0 = cmd.Parameters.Add("uniqueId", OracleDbType.Int64);
    oparam0.Value = 5 ;
    oparam0.Direction = ParameterDirection.Input;

    OracleParameter oparam1 = cmd.Parameters.Add("resultItems", OracleDbType.RefCursor);
    oparam1.Direction = ParameterDirection.Output;




    // Execute command
    OracleDataReader reader;
    try
    {
    reader = cmd.ExecuteReader();

    while(reader.Read() ){
    Console.WriteLine("level: {0}", reader.GetDecimal(0));
    }

    } ...

    现在要获取更多示例,请转到您的 Oracle 主目录并查看 @ODP.NET 中的 Ref 游标示例

    例如:
    %oracle 客户端主页%\odp.net\samples\4\RefCursor

    关于oracle - 如何从 C# 调用带有 Ref Cursor 作为 Out 参数的 Oracle 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360244/

    46 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com