【问题标题】:Issue while invoking an oracle stored procedure from .net with user defined type使用用户定义类型从 .net 调用 oracle 存储过程时出现问题
【发布时间】:2019-02-14 04:13:41
【问题描述】:

我正在尝试调用在 Orracle 包中定义的 Oracle 存储过程。 该过程没有输入参数,只有一个用户定义类型的输出参数。以下是包和 UDT 的详细信息:

CREATE OR REPLACE TYPE obj_systemdetail AS OBJECT
(
          sys_id VARCHAR2(8 CHAR),
          sys_name VARCHAR2(6 CHAR),
          sys_desc VARCHAR2(100 CHAR),
          sys_start_date DATE
);

CREATE OR REPLACE TYPE tab_systemdetailslist IS TABLE OF obj_systemdetail

CREATE OR REPLACE PACKAGE pck_sysDetails IS

    PROCEDURE get_systemdetails(p_system_details OUT NOCOPY tab_systemdetailslist);

END pck_sysDetails;

尝试从 .net 调用它,如下所示

using Oracle.ManagedDataAccess.Client;

    OracleConnection conn = new OracleConnection("User Id=ptTest;Password=p1_sttest;Data Source=STMP231");
    OracleCommand cmd = conn.CreateCommand();
    cmd.CommandText = "pck_sysDetails.get_systemdetails";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new OracleParameter("p_system_details", OracleDbType.Varchar2)
        {
            UdtTypeName = "tab_systemdetailslist",
            Size = 100,
            ArrayBindSize = new int[100],
            Direction = ParameterDirection.Output
        });
    conn.Open();
    cmd.ExecuteNonQuery();

可以连接db,但是执行代码时出现这个错误

ORA-06550:调用“GET_SYSTEMDETAILS”时参数的数量或类型错误

尝试了很多搜索,但找不到任何关于如何将此 UDT 类型设置为输出参数的有用信息。

请问有人可以帮我解决这个问题吗?

【问题讨论】:

  • 那么当您运行代码时会发生什么?您提供的信息越多,您就越有可能获得及时和有用的回复。 (虽然我怀疑@oldprogrammer 在正确的行上。)
  • 执行代码时出现此错误 - ORA-06550: 调用 'GET_SYSTEMDETAILS' @oldprogrammer 时参数的数量或类型错误,感谢您的链接。在我的情况下,我没有任何输入参数所以我该怎么做?我需要映射输出参数吗?我的意思是说我没有像这样设置的输入。 oracleParam.Value = 实体;
  • 为了将来参考,请编辑您的问题以包括澄清或附加信息。
  • 有人可以帮我吗

标签: c# .net oracle stored-procedures user-defined-types


【解决方案1】:

我认为问题在于您的输出类型不是 Varchar2,正如您在此行中定义的那样:

cmd.Parameters.Add(new OracleParameter("p_system_details", OracleDbType.Varchar2)

您已将 p_system_details 定义为 varchar2 和日期的对象,而不是单个 varchar2。返回类型可能是 Array,具体取决于您使用的 Oracle 数据访问驱动程序。例如,this solution 对其 UDT 使用返回类型 Array

如果您的驱动程序没有正确支持 UDT 作为类型,我认为一种选择是将存储过程的返回类型更改为驱动程序支持的类型,例如 Oracle SYS_REFCURSOR,定义在.NET 作为OracleDbType.RefCursor 可以返回您正在寻找的相同数据元素。

create or replace PROCEDURE AOF_JOE_TEST_CURSOR_SP (p_system_details OUT SYS_REFCURSOR) AS

BEGIN
OPEN p_system_details FOR

SELECT
    'Test1' as sys_id,
    'Test2' as sys_name,
    'Test3' as sys_desc,
    SYSDATE as sys_start_date
FROM DUAL;

END;

然后,您的参数在 .NET 中定义为:

OracleParameter cursorParameter = new OracleParameter();
cursorParameter.ParameterName = "p_system_details";
cursorParameter.Direction = ParameterDirection.Output;
cursorParameter.OracleDbType = OracleDbType.RefCursor;
cmd.Parameters.Add(cursorParameter);

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多