【发布时间】:2021-01-30 16:30:41
【问题描述】:
我们在通过 dblink (dg4msql) 从 Oracle 18 向 SQL Server 2016 插入数据时遇到问题。
环境:
- ORACLE 版本 18.4.0.0.0 + Oracle Database Gateway for MS SQL Server 18.0.0.0.0 在不同的主机上
- SQL Server 2016 (v13.0.4001.0)
在ORACLE GW中设置参数:
HS_LANGUAGE=RUSSIAN_RUSSIA.CL8MSWIN1251
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
HS_FDS_CONNECT_INFO=X.X.X.X:1433//BUFFER1
HS_NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
HS_NLS_NUMERIC_CHARACTER=".,"
Oracle 客户端(sqlplus):
NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
NLS_NUMERIC_CHARACTERS=".,"
在 Oracle 中,我们有全局临时表
desc TBL_KPI_2G_TEMP
Name Null? Type
----------------------------------------- -------- ----------------------------
d DATE
reg VARCHAR2(500)
LAC NUMBER
CI NUMBER
Cell VARCHAR2(500)
traf_sp NUMBER
cssr NUMBER
bcr NUMBER
dcr NUMBER
hr_usage NUMBER
trf_bh NUMBER
trf_bh_30_avg NUMBER
trf_bh_30_max NUMBER
trf_bh_30_perc_92 NUMBER
trf_ul_mb NUMBER
trf_dl_mb NUMBER
tbf_sr NUMBER
tbf_dr NUMBER
tbf_br NUMBER
avail NUMBER
ho_sr NUMBER
在 SQL Server 中:
SELECT
table_name, column_name, data_type, character_maximum_length, numeric_precision
FROM
INFORMATION_SCHEMA.COLUMNS@MS_DBLINK
WHERE
TABLE_NAME = 'TBL_KPI_2G';
TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH NUMERIC_PRECISION
TBL_KPI_2G id int 10
TBL_KPI_2G d datetime
TBL_KPI_2G reg varchar 500
TBL_KPI_2G LAC float 53
TBL_KPI_2G CI float 53
TBL_KPI_2G Cell varchar 500
TBL_KPI_2G traf_sp float 53
TBL_KPI_2G cssr float 53
TBL_KPI_2G bcr float 53
TBL_KPI_2G dcr float 53
TBL_KPI_2G hr_usage float 53
TBL_KPI_2G trf_bh float 53
TBL_KPI_2G trf_bh_30_avg float 53
TBL_KPI_2G trf_bh_30_max float 53
TBL_KPI_2G trf_bh_30_perc_92 float 53
TBL_KPI_2G trf_ul_mb float 53
TBL_KPI_2G trf_dl_mb float 53
TBL_KPI_2G tbf_sr float 53
TBL_KPI_2G tbf_dr float 53
TBL_KPI_2G tbf_br float 53
TBL_KPI_2G avail float 53
TBL_KPI_2G ho_sr float 53
TBL_KPI_2G d2 date
TBL_KPI_2G d3 datetime2
TBL_KPI_2G beg varchar 20
TBL_KPI_2G ends varchar 20
TBL_KPI_2G mid1 varchar 20
TBL_KPI_2G mid2 varchar 20
第一个问题(列反转):
insert into TBL_KPI_2G@MS_DBLINK ("beg", "mid1", "mid2", "ends")
select
'1','2','3','4'
from TBL_KPI_2G_TEMP;
1 rows created.
SQL> commit;
Commit complete.
SQL> select "beg","mid1","mid2","ends"from TBL_KPI_2G@MS_DBLINK;
beg
------------------------------------------------------------
mid1
------------------------------------------------------------
mid2
------------------------------------------------------------
ends
------------------------------------------------------------
4
3
2
1
--------第二个问题(无效字符值)-----------
SQL> insert into TBL_KPI_2G@MS_DBLINK("d","Cell","trf_ul_mb","reg","d3") select'2020-10-15 21:14:09','ZZZZZZZZZZZZZZZZ',5.6,'ffff','2020-10-15 21:14:09' from dual;
1 row created.
SQL> insert into TBL_KPI_2G@MS_DBLINK("d","Cell","trf_ul_mb","reg","d3") select'2020-10-15 21:14:09','ZZZZZZZZZZZZZZZZ',5.6,'ffff','2020-10-15 21:14:09' from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> insert into TBL_KPI_2G@MS_DBLINK("d","Cell","trf_ul_mb","reg","d3") select'2020-10-15 21:14:09','ZZZZZZZZZZZZZZZZ',5.6,'ffff','2020-10-15 21:14:09' from dual;
insert into TBL_KPI_2G@MS_DBLINK("d","Cell","trf_ul_mb","reg","d3") select'2020-10-15 21:14:09','ZZZZZZZZZZZZZZZZ',5.6,'ffff','2020-10-15 21:14:09' from dual
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [qerrdmliFlushRows], [28500],
[ORA-28500: connection from ORACLE to a non-Oracle system returned this
message:
[Oracle][ODBC SQL Server Wire Protocol driver]Invalid character value. Error in
parameter 4. {22018}
ORA-02063: preceding 2 lines from MS_DBLINK
], [], [], [], [], [], [], [], [], []
select "d","Cell","trf_ul_mb","reg","d3" from TBL_KPI_2G@MS_DBLINK;
d Cell trf_ul_mb reg d3
------------------------------ ------------------------------ ---------- ------------------------------ ------------------------------
2020-10-15 21:14:09 B ?H ?? ??? @? ########## ZZZZZZZZZZZZZZZZ 2020-10-15 21:14:09
??U ?F @
2020-10-15 21:14:09 B ?H ?? ??? @? ########## ZZZZZZZZZZZZZZZZ 2020-10-15 21:14:09
H?U ?F @
我不明白会发生什么。
【问题讨论】:
标签: sql-server database oracle