Вставка имени в базу данных, получение корейских знаков в качестве вывода - PullRequest
0 голосов
/ 10 июня 2019

Попытка вставить простой файл XML с одной строкой в ​​IIB с простым потоком сообщений в базу данных Oracle XE. Поток сообщений работает нормально и вставляет данные в базу данных, но данные, записанные в БД, отличаются от исходных данных. Например, когда я пытаюсь вставить свое имя «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 голосов
/ 14 июня 2019

Посмотрите документацию IBM для оператора INSERT в ESQL, возможно, стоит попробовать.

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;

Также проверьте кодовые страницы aka 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)
...