【问题标题】:Get User Collection Type Object (Table) as Out Parameter from Oracle stored procedure从 Oracle 存储过程中获取用户集合类型对象(表)作为 Out 参数
【发布时间】:2019-12-06 04:16:24
【问题描述】:

我需要从 Oracle 存储过程(包内)中取回一个定义为用户集合类型对象(表)的输出参数。

Procedure GetCon (DataRif IN VARCHAR2,Results OUT my_collectiontype)
   IS
      BEGIN
          select my_ObjectType(Col1,Col2)
          bulk collect into Results
          FROM
          TABLE(PMS.myfunc(DataRif ,'31-12-2019');
      END;
....

函数 PMS.myfunc 返回一个 my_collectiontype 对象

在我的代码(带有 Oracle ManagedDataAccess 驱动程序的 Asp.net 4.0 VB.NET)中,我已经尝试过

        strConn = "Data Source=XE.WORK;User Id=PMS;Password=xxxx"
        Dim con As New OracleConnection(strConn)

        Dim dt As DataTable = New DataTable()
        Dim da As OracleDataAdapter = New OracleDataAdapter()

        con.Open()

        Dim cmd As New OracleCommand()
        cmd.Connection = con
        cmd.CommandText = "MySchema.MyPackage.GetCon"
        cmd.CommandType = CommandType.StoredProcedure

        cmd.Parameters.Add("DataRif", OracleDbType.Varchar2,"23-07-2019", ParameterDirection.Input)
        cmd.Parameters.Add("Results", OracleDbType.RefCursor).Direction = ParameterDirection.Output

        da.SelectCommand = cmd
        cmd.ExecuteNonQuery()
        da.Fill(dt)
        .....

我收到此错误

ORA-06550:第 1 行,第 7 列:PLS-00306:调用“GETCONT”时参数的数量或类型错误
ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略"

确定 out 参数不是引用光标,但我找不到正确的对象。

我需要使用存储过程,因为我知道它可以作为简单视图执行类似的操作

SELECT * FROM TABLE (PMS.myfunc('01-01-2019', '31-12-2019')

但这个解决方案目前不是最好的。

提前致谢。

【问题讨论】:

  • 尝试以大写形式指定过程和参数名称,例如使用"MYSCHEMA.MYPACKAGE.GETCON""DATARIF""RESULTS"。在内部,Oracle 以大写形式存储所有名称。

标签: asp.net oracle stored-procedures


【解决方案1】:

通过以下方式解决,允许接收光标并将其放入数据集中。

像这样在 Oracle 中创建存储过程

CREATE OR REPLACE PROCEDURE get_emp_rs (p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
  OPEN p_recordset FOR
    SELECT DIP_ID,DIP_NAME
    FROM  TABLE(fn_GetDataFunction('01-01-2019','31-12-2019','15-09-2019'));
END get_emp_rs;
/

在 Asp.net 中

Public Function TestCursor() As DataSet

        Dim strConn As String = "Data Source=MYSOURCE;User Id=MYID;Password=xxxxx"
        Dim dsReturn As DataSet = Nothing

        Try
            Using con As New OracleConnection(strConn)
                Using sda As New OracleDataAdapter()
                    Dim cmd As New OracleCommand()
                    cmd.Connection = con
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.CommandText = "get_emp_rs"

                    cmd.Parameters.Add("p_recordset", OracleDbType.RefCursor).Direction = ParameterDirection.Output

                    sda.SelectCommand = cmd
                    Using ds As New System.Data.DataSet("results")
                        sda.Fill(ds, "MyTableName")
                        Return ds
                    End Using
                End Using
            End Using
        Catch ex As Exception
           '---------
        End Try
    End Function

【讨论】:

    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2011-09-18
    • 2012-07-26
    • 2013-11-02
    相关资源
    最近更新 更多