在使用ODP.NET中的Oracle UDT(用户定义类型)时出现奇怪的问题

3

Oracle 11g.

我在使用用户定义类型(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;

在C#代码中:

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",错误就消失了,一切正常运行。

有人有任何线索吗?

提前感谢。


在 user_b 用户下运行 select * from all_objects where object_name = 'TAB_NUMBERS'。 - vav
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接