高分求解在线等!sqlserver和oracle对接问题!

时间:2021-04-22 05:47:04
之前我们对接好好的,但不知道为什么在上星期就出问题了。
本地数据库是sqlserver,中间表是oracle,具体表现为:其他中间表无论有没有数据都能访问,中间订单表AYY_ORDER在没数据也能访问,但有数据就无法访问了。
两个数据库对接是采用中间表定时同步方式的。


当他们把AYY_ORDER的数据清空了我们就能访问,但这表有数据就不能访问,查询代码是

SELECT  * 
FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')

中间表有数据就提示:


消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
当前命令发生了严重错误。应放弃任何可能产生的结果。


然后我们换了个命令:

select * from HD..HD4.AYY_ORDER

就提示

消息 7356,级别 16,状态 1,第 2 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。对象 ""HD4"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。


中间表的"NUM"字段我们也检查过了,中间表是varchar2(20)

11 个解决方案

#1


的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130

你是不是修改数据库结构了?

#3


"NUM"列出问题了吧?

你可以尝试不选择num列再试试

例如:

select 不要num列的其他列 from ...

如果没问题,就检查num列.

#4


引用 1 楼 maco_wang 的回复:
的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130

你是不是修改数据库结构了?

无论是中间表还是本地表都没做修改,管理员也检查过表权限,没权限问题

#5


把NUM修改为varchar

#6


引用 3 楼 dawugui 的回复:
"NUM"列出问题了吧?

你可以尝试不选择num列再试试

例如:

select 不要num列的其他列 from ...

如果没问题,就检查num列.


插入数据后运行

SELECT  num, cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr

FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')


无论有没有查询列 "NUM" ,得到都是

消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
A severe error occurred on the current command.  The results, if any, should be discarded.


查询:
select cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr from HD..HD4.AYY_ORDER


得到的是:

消息 7356,级别 16,状态 1,第 1 行
链接服务器 "HDAPP" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。
对象 ""HD40"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。

#7


引用 5 楼 ssp2009 的回复:
把NUM修改为varchar


中间表还有其他的表也是使用varchar2(64)的但都没问题。。。。就这表有问题,纠结啊

#8


1.确保你们访问的是那个指定的表,而不是由于用户不同面得到的不同表.
2.把该表删除重建一下试试.

#9


你何必如此纠结?
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;

然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp

#10


据我所知SQL Server没有varchar2数据类型,应该是在转换类型是出错了.

试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).

#11


谢谢大家的热心帮忙,问题已经解决!原因是oracle中间表的一个字段长度过长,达到1024,换成255就成功了,在此谢谢各位的帮助,积分平分!

#1


的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130

你是不是修改数据库结构了?

#2


#3


"NUM"列出问题了吧?

你可以尝试不选择num列再试试

例如:

select 不要num列的其他列 from ...

如果没问题,就检查num列.

#4


引用 1 楼 maco_wang 的回复:
的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130

你是不是修改数据库结构了?

无论是中间表还是本地表都没做修改,管理员也检查过表权限,没权限问题

#5


把NUM修改为varchar

#6


引用 3 楼 dawugui 的回复:
"NUM"列出问题了吧?

你可以尝试不选择num列再试试

例如:

select 不要num列的其他列 from ...

如果没问题,就检查num列.


插入数据后运行

SELECT  num, cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr

FROM OPENQUERY(HD,'select * from HD4.AYY_ORDER')


无论有没有查询列 "NUM" ,得到都是

消息 7399,级别 16,状态 1,第 1 行
链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 报错。提供程序报告了意外的灾难性错误。
消息 7331,级别 16,状态 2,第 1 行
无法释放来自链接服务器 "HD" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的行。
消息 0,级别 20,状态 0,第 0 行
A severe error occurred on the current command.  The results, if any, should be discarded.


查询:
select cls ,stat,src,vendor,wrh,psr,note,sumtotal,sumtax,rcvaddr from HD..HD4.AYY_ORDER


得到的是:

消息 7356,级别 16,状态 1,第 1 行
链接服务器 "HDAPP" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 为列提供的元数据不一致。
对象 ""HD40"."AYY_ORDER"" 的列 "NUM" (编译时序号为 1)在编译时有 129 的 "DBTYPE",但在运行时有 130。

#7


引用 5 楼 ssp2009 的回复:
把NUM修改为varchar


中间表还有其他的表也是使用varchar2(64)的但都没问题。。。。就这表有问题,纠结啊

#8


1.确保你们访问的是那个指定的表,而不是由于用户不同面得到的不同表.
2.把该表删除重建一下试试.

#9


你何必如此纠结?
--假设原来的表为TB
create table tmp as select * from tb
commit;
如果没有数据,则插入
insert into tmp select * from tmp
commit;

然后去对表tmp做测试,看是不是NUM列的问题.查对后,更改tb或者删除TB表,利用TMP生成tb
drop table tb
create table tb as select * from tmp

#10


据我所知SQL Server没有varchar2数据类型,应该是在转换类型是出错了.

试试将Oracle里的AYY_ORDER表的NUM字段修改为varchar(20)类型(或nvarchar(20)).

#11


谢谢大家的热心帮忙,问题已经解决!原因是oracle中间表的一个字段长度过长,达到1024,换成255就成功了,在此谢谢各位的帮助,积分平分!