Странная проблема при использовании Oracle UDT в ODP.NET (определяемый пользователем тип)

Оракул 11г.

Я столкнулся со странной проблемой при использовании UDT, у меня есть эти 4 схемы: USER_1, USER_2, USER_A, USER_B. И USER_1, и USER_2 имеют UDT (фактически вложенную таблицу):

CREATE OR REPLACE TYPE TAB_NUMBERS AS TABLE OF NUMBER(10)

USER_A имеет синоним, указывающий на тип в USER_1:

create or replace synonym TAB_NUMBERS for USER_1.TAB_NUMBERS;

USER_B имеет синоним, указывающий на тип в USER_2:

create or replace synonym TAB_NUMBERS for USER_2.TAB_NUMBERS;

И USER_A, и USER_B имеют процедуру, использующую синоним:

CREATE OR REPLACE PROCEDURE proc_test (p1 in tab_numbers)
IS
BEGIN
  NULL;
END;

И в коде С#:

OracleConnection conn = new OracleConnection("data source=mh;user id=USER_A;password=...");
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "proc_test";
cmd.CommandType = CommandType.StoredProcedure;
//
OracleParameter op = new OracleParameter();
op.ParameterName = "p1";
op.Direction = ParameterDirection.Input;
op.OracleDbType = OracleDbType.Object;
op.UdtTypeName = "TAB_NUMBERS";
Nested_Tab_Mapping_To_Object nt = new Nested_Tab_Mapping_To_Object();
nt.container = new decimal[] { 1, 2 };
op.Value = nt;
......

Этот код работает нормально, но возникает ошибка, когда я изменяю строку подключения с USER_A на USER_B, ошибка говорит:

OCI-22303: type ""."TAB_NUMBERS" not found

Интересно, если я изменю op.UdtTypeName = "TAB_NUMBERS"; на op.UdtTypeName="USER_2.TAB_NUMBERS", ошибка ушла, все работает нормально.

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

Заранее спасибо.


person gfytd    schedule 30.05.2012    source источник
comment
под user_b запустите select * from all_objects, где object_name = 'TAB_NUMBERS'   -  person vav    schedule 28.05.2014


Ответы (1)


Сопоставления пользовательских типов нельзя указывать с помощью синонимов, независимо от того, предоставлено ли сопоставление через объект OracleCustomTypeMappingAttribute или файл конфигурации XML.

https://docs.oracle.com/cd/E11882_01/win.112/e23174/featUDTs.htm#ODPNT382

person Mark Fennell    schedule 08.09.2016