ORA-21700: объект не существует или помечен для удаления для ассоциативного массива как входной параметр, вызываемый из ODP.NET - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть этот код пакета в Oracle 12c

CREATE OR REPLACE PACKAGE Support_Data_Types AS
  TYPE ttDate            IS TABLE OF DATE  
END Support_Data_Types;

PROCEDURE GetData
(
    tabDates        IN SUPPORT_DATA_TYPES.TTDATE,
)

AS
BEGIN

    SELECT count(*) INTO n FROM table(tabDates);

END GetData;

Если я вызываю его из PL/SQL кода, он работает

declare
    dates SUPPORT_DATA_TYPES.TTDATE;
begin
    dates(1) := To_DATE('12/31/2005','MM/DD/YYYY');
    dates(2) := To_DATE('03/31/2006','MM/DD/YYYY');
    dates(3) := To_DATE('06/30/2006','MM/DD/YYYY');
    dates(4) := To_DATE('09/30/2006','MM/DD/YYYY');

    MyPackage.GETVALUE(dates);
end;

Но если я вызываю его из ODP.NET, тогдаЯ получаю сообщение об ошибке на линии SELECT count(*) INTO n FROM table(tabDates);

ORA-21700: объект не существует или помечен для удаления

Мой код .NET

    Public Function GetValue(dates As IEnumerable(Of Date))

        Using connection As IDbConnection = Odp.ConnectionBuilder.CreateDatabaseConnection()
            Using cmd As OracleCommand = New OracleCommand
                cmd.Connection = DirectCast(connection, OracleConnection)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.CommandText = "MyPackage.GETVALUE"
                cmd.BindByName = True

                Using datesParam As OracleParameter = New OracleParameter()
                    datesParam.ParameterName = "tabDates"
                    datesParam.OracleDbType = OracleDbType.Date
                    datesParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray
                    datesParam.Size = dates.Count()
                    datesParam.Direction = ParameterDirection.Input
                    datesParam.Value = dates.ToArray()
                    cmd.Parameters.Add(datesParam)
                End Using

                cmd.ExecuteNonQuery()

            End Using
        End Using
    End Function

Если я сравню с образцом кода Oracle Я не уверен, что здесь не так.

У кого-нибудь есть понимание?

1 Ответ

0 голосов
/ 20 июня 2019

после нескольких дней поиска в Google, я изменил код следующим образом:

CREATE OR REPLACE PACKAGE Support_Data_Types AS
            TYPE ttDate            IS TABLE OF DATE
END Support_Data_Types;
PROCEDURE GetData
(
    tabDates IN SUPPORT_DATA_TYPES.TTDATE,
)
AS
    v_temp SUPPORT_DATA_TYPES.TTDATE:= tabDates;  -- assigned the parameter to a temporary variable
BEGIN
    SELECT count(*) INTO n FROM table(v_temp);
END GetData;

Единственное, что я сделал, это использовал v_temp, который выглядит довольно избыточным.но это работает.Я сделал это изменение, потому что я искал эту статью здесь ... там упоминалось:

Обратите внимание, однако, что с 12.1 вы не можете вызывать табличную функцию непосредственно внутри TABLEоператор.Вы должны вызвать его в PL / SQL, присвоить результат переменной, а затем сослаться на переменную внутри TABLE.

, хотя в моем случае ситуация иная (я использую 12.2), это решило мою проблему.проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...