【问题标题】:Calling Stored procedures from C# with Oracle type like Table of CustomType使用 Oracle 类型(如 CustomType 表)从 C# 调用存储过程
【发布时间】:2014-07-16 04:10:06
【问题描述】:

我在 C# 中使用 Oracle.DataAccess 库执行 Oracle 存储过程时遇到问题。

在 oracle 中我有这个结构;

CREATE OR REPLACE TYPE O_MOV_LST_STA_STATUS AS TABLE OF O_MOV_STATION_STATUS;o_mov_lst_sta_status

并且类型描述如下:

CREATE OR REPLACE TYPE O_MOV_STATION_STATUS AS OBJECT
          (
        StationT   NUMBER(10),
        StationN       NUMBER(10),
        Stat           NUMBER(3),
        Loaded         NUMBER(1),
        Capacity       NUMBER(10),
        CurrentCount  NUMBER(10),
        Box            NUMBER(10)
          );

以及程序定义:

PROCEDURE UPDATE_STATIONS(pn_warehouse_id_in IN wms_warehouse.warehouse_id%TYPE,
                            prl_sta_status_in  IN o_mov_lst_sta_status,
                            pn_error_code_out  OUT NUMBER,
                            pv_error_text_out  OUT NOCOPY VARCHAR2);

在 C# 中的代码是这样的:

public struct O_Mov_Station_Status
        {
            public decimal StationT;//     NUMBER(10),
            public decimal StationN;//     NUMBER(10),
            public decimal Stat;//         NUMBER(3),
            public decimal Loaded;//           NUMBER(1),
            public decimal Capacity;//     NUMBER(10),
            public decimal CurrentCount;//     NUMBER(10),
            public decimal Box;//          NUMBER(10)
        }

        public struct Lst_O_Mov_Station_Status
        {
            public IList<O_Mov_Station_Status> Lst_Station_Status;
        }
... Initializing vars and objects ...

OracleCommand cmd = new OracleCommand("MyPackage.UPDATE_STATIONS", con);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            //Oracle Parameter
            OracleParameter objParam = new OracleParameter();

            objParam = new OracleParameter("PN_WAREHOUSE_ID_IN", OracleDbType.Decimal);
            objParam.Direction = System.Data.ParameterDirection.Input;
            objParam.Value = 20000;
            cmd.Parameters.Add(objParam);

            objParam.Dispose();
            objParam = new OracleParameter("prl_sta_status_in", OracleDbType.Object);
            objParam.OracleDbType = OracleDbType.Object;
            objParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            objParam.Direction = System.Data.ParameterDirection.Input;
            objParam.UdtTypeName = "O_MOV_STATION_STATUS";
            objParam.Value = lSS;
            objParam.DbType = System.Data.DbType.Object;
            cmd.Parameters.Add(objParam);

            objParam.Dispose();
            objParam = new OracleParameter("PN_ERROR_CODE_OUT", OracleDbType.Decimal);
            objParam.Direction = System.Data.ParameterDirection.Output;
            cmd.Parameters.Add(objParam);

            objParam.Dispose();
            objParam = new OracleParameter("PV_ERROR_TEXT_OUT", OracleDbType.Varchar2);
            objParam.Direction = System.Data.ParameterDirection.Output;
            cmd.Parameters.Add(objParam);

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close(); 

执行 ExecuteNonQuery() 后,我收到此错误:OracleParameter.Value is not valid.

每个人都知道如何将这个列表作为存储过程的参数发送?

请注意,我需要的列表是 Oracle 中的自定义类型表

非常感谢。

问候。

【问题讨论】:

    标签: c# oracle stored-procedures


    【解决方案1】:

    OracleCollectionType.PLSQLAssociativeArray 表示普通类型的 PL/SQL 关联数组,例如

    CREATE OR REPLACE TYPE O_MOV_STATION_STATUS AS TABLE OF NUMBER INDEX BY INTEGER;
    

    据我所知,复杂的对象类型是不可能的。 我假设您必须对表的每条记录进行循环,或者在 PL/SQL 中编写一个函数来包装对象。

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 2013-12-04
      • 2011-09-18
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多