将名称插入数据库,获得韩文符号作为输出

时间:2019-06-10 08:23:53

标签: oracle-xe ibm-integration-bus extended-sql

尝试在IIB中将具有简单消息流的简单xml文件插入一行,并将其插入Oracle XE DB。消息流可以正常工作并将数据插入数据库,但是用db写入的数据与启动数据不同。例如,当我尝试输入我的名字“ Dino”时,我会得到韩文/日文/中文标志。

我曾尝试过更改XML格式,以为可能存在问题,但我想这与编码有关。

  • 输入:

enter image description here

  • 数据库中的输出:

enter image description here

这是我的计算节点的外观:

    CREATE COMPUTE MODULE SimpleDB_mf_Compute 

CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
     CALL CopyMessageHeaders();
    -- CALL CopyEntireMessage();
    INSERT INTO Database.dkralj.emp VALUES(InputRoot.XMLNSC.emp.name);
    SET OutputRoot.XMLNSC.DBINSERT.STATUS='SUCCESS';
    RETURN TRUE;
END;

CREATE PROCEDURE CopyMessageHeaders() BEGIN
    DECLARE I INTEGER 1;
    DECLARE J INTEGER;
    SET J = CARDINALITY(InputRoot.*[]);
    WHILE I < J DO
        SET OutputRoot.*[I] = InputRoot.*[I];
        SET I = I + 1;
    END WHILE;
END;

CREATE PROCEDURE CopyEntireMessage() BEGIN
    SET OutputRoot = InputRoot;
END;
    END MODULE;

1 个答案:

答案 0 :(得分:0)

在ESQL中查看INSERT语句的IBM文档可能值得尝试。

INSERT INTO Database.dkralj(NAME) VALUES(InputRoot.XMLNSC.emp.name);

如果仍然发生怪异的事情,那么我会尝试使用字符串常量来避免输入消息中的字符编码出现任何问题。

INSERT INTO Database.dkralj(NAME) VALUES('TheEmpValue');

在您的代码中此语句之前

SET OutputRoot.XMLNSC.DBINSERT.STATUS='SUCCESS';

您应该使用内置的SQLSTATE,SQLCODE,SQLERRORTEXT检查调用是否成功。

IF NOT ((SQLCODE = 0) OR (SQLSTATE = '01000' AND SQLNATIVEERROR = 8153)) THEN
    -- Do something about the error.
    -- The check of SQLSTATE and SQLNATIVEERROR covers warnings
    -- The 8153 is for Microsoft SQL Server other databases may use a different value
END IF;

还要检查源系统数据的代码页(也称为CodedCharSetId),IIB中的消息和数据库的默认代码页。

使用mqsicvp MYBROKER -n ODBC_DB_NAME获取有关连接的其他详细信息,您需要使用-n来获取详细信息。

使用DBeaver之类的东西来添加一些数据。查看为该字段指定的数据类型。

根据您在下面的评论,我在这里的答复是PASSTHRU语句的示例。注意使用?避免SQL注入。

PASSTHRU('SELECT RTRIM(A.EMPLID) AS EMPLID,
       RTRIM(A.ADDRESS_TYPE) AS ADDRESS_TYPE,
       RTRIM(A.ADDR_TYPE_DESCR) AS ADDR_TYPE_DESCR,
       CAST(RTRIM(A.EFFDT) AS DATE) AS EFFDT,
       RTRIM(A.EFF_STATUS) AS EFF_STATUS,
       RTRIM(A.ADDRESS1) AS ADDRESS1,
       RTRIM(A.ADDRESS2) AS ADDRESS2,
       RTRIM(A.ADDRESS3) AS ADDRESS3,
       RTRIM(A.ADDRESS4) AS ADDRESS4,
       RTRIM(A.CITY) AS CITY,
       RTRIM(A.STATE) AS STATE,
       RTRIM(A.POSTAL) AS POSTAL
FROM ADDRESS_VW AS A 
WHERE UPPER(A.EMPLID) = ?') VALUES(AggrRef.EmployeeID)