【问题标题】:Insert data from Oracle 18 to SQL Server 2016 over dblink (dg4msql)通过 dblink (dg4msql) 将数据从 Oracle 18 插入 SQL Server 2016
【发布时间】: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)

对于我使用的映射数据类型: https://docs.microsoft.com/en-us/sql/relational-databases/replication/non-sql/data-type-mapping-for-oracle-publishers?view=sql-server-2016

在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


    【解决方案1】:

    我觉得你不明白

    SQL> delete from TBL_KPI_2G@MS_DBLINK;
    commit;
    
    1 row deleted.
    
    SQL>
    Commit complete.
    
    SQL> SQL> SQL>
    SQL>
    SQL> select '1' "beg",'2' "mid1" ,'3' "mid2",'4' "ends" from dual;
    
    beg                  mid1                 mid2                 ends
    -------------------- -------------------- -------------------- --------------------
    1                    2                    3                    4
    
    SQL> insert into TBL_KPI_2G@MS_DBLINK ("beg", "mid1", "mid2", "ends")
      2  select '1' "beg",'2' "mid1" ,'3' "mid2",'4' "ends" from dual;
    
    1 row 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
    

    enter image description here

    当字段区分大小写时使用双引号 enter image description here

    插入一个值可以正常工作,但我需要从表中插入数据并且遇到问题“异构服务数据类型映射错误”

        delete from TBL_KPI_2G@MS_DBLINK;
    
    1 row deleted.
    
    SQL>  insert into TBL_KPI_2G_TEMP ("d", "Cell", "trf_ul_mb", "reg", "d3") values
       ('2020-10-15 21:14:09',
        'ZZZZZZZZZZZZZZZZ',
        5.6,
        'ffff',
        '2020-10-15 21:14:09');   2    3    4    5    6
    
    1 row created.
    
    SQL>  insert into TBL_KPI_2G@MS_DBLINK("d", "Cell", "trf_ul_mb", "reg", "d3") select "d", "Cell", "trf_ul_mb", "reg", "d3" from TBL_KPI_2G_TEMP;
     insert into TBL_KPI_2G@MS_DBLINK("d", "Cell", "trf_ul_mb", "reg", "d3") select "d", "Cell", "trf_ul_mb", "reg", "d3" from TBL_KPI_2G_TEMP
                                                                                                                     *
    ERROR at line 1:
    ORA-00600: internal error code, arguments: [qerrdmliFlushRows], [28527], [ORA-28527: Heterogeneous Services datatype mapping error
    ORA-02063: preceding line from MS_DBLINK
    ], [], [], [], [], [], [], [], [], []
    
    
    SQL> insert into TBL_KPI_2G@MS_DBLINK
       ("d", "Cell", "trf_ul_mb", "reg", "d3")
    values
       ('2020-10-15 21:14:09',
        'ZZZZZZZZZZZZZZZZ',
        5.6,
        'ffff',
        '2020-10-15 21:14:09');  2    3    4    5    6    7    8
    
    1 row created.
    
    SQL> 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  ZZZZZZZZZZZZZZZZ          5.60 ffff                 2020-10-15 21:14:09
    

    【讨论】:

    • 这是一个答案,还是您的问题的重新表述?你有两个问题,但对我来说不清楚问题是什么,因为我给了你一些提示,而你没有使用这些提示。如果您仍然需要帮助,请去掉 SQL 查询中的引号,简化事情,尝试我的建议,然后提出一个真正的问题。
    • 问题,为什么 MS SQL 反转插入的数据?
    • 我无法去掉引号,因为列的名称是小写的
    【解决方案2】:

    你的第一个问题不是问题。它显示一行输出。该行包含四个非常宽的字段,并折叠在四行屏幕输出上,但它仍然是一行。有一些命令可以将字段格式化为较短的字符串,但表格数据就可以了。

    关于您的第二个问题:为什么不使用更标准的方法,例如:

    insert into TBL_KPI_2G@MS_DBLINK
       (d, Cell, trf_ul_mb, reg, d3)
    values
       ('2020-10-15 21:14:09', 
        'ZZZZZZZZZZZZZZZZ',
        5.6,
        'ffff',
        '2020-10-15 21:14:09');
    

    将查询格式化为更多行有助于理解。

    字段名称周围的引号可以避免但也会导致大小写问题。通常,您不需要这些引号。

    不需要 FROM DUAL。


    关于问题 1:您确定插入了 1 行的四个字段吗?看起来您插入了 1 个字段的 4 行。误会的原因是没有使用values(...)

    此外,在 SQL 中,行不是“有序”存储的。您可以在选择查询中明确指定 ORDER BY 以查看您的表格。

    试试:

    SELECT "beg" FROM TBL_KPI_2G@MS_DBLINK;
    

    这可能会显示 4 条记录。

    【讨论】:

    • 这是一个问题,因为插入信息的顺序改变了它是'1','2','3','4'但是我们得到'4','3',' 2', '1' 请求字段的顺序(“beg”、“mid1”、“mid2”、“ends”)没有变化,你不小心!
    • 你的“问题”中没有问号,但是你写的是“我不明白”,所以我回答的比较基础。为什么不首先简化插入查询?在第一个问题中,您还应该从字段名称中删除引号,并使用values(...) 而不是select...from...,并以更漂亮的打印方式格式化整个查询。然后重试,了解更多,提出更具体的问题。
    • SQL> 从 TBL_KPI_2G@MS_DBLINK 中选择“请求”;求 -------------------- 4
    • 从 TBL_KPI_2G@MS_DBLINK 中选择“请求”;只显示一条记录。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 2014-04-07
    • 2011-05-07
    • 2017-09-08
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多