Значение столбца курсора случайно усекается?
У меня есть курсор в хранимой процедуре оракула, который случайно обрезает значение в одном из возвращаемых столбцов.
Я не вижу никакой картины в этом, иногда это работает, а иногда просто обрезает значение до 1 символа в длину.
Это курсор:
CURSOR cur_clients IS
SELECT DISTINCT p.PROPOSAL_ID, rop.client_id, c.FORENAME, c.INITIAL1, c.SURNAME, concat(c.FORENAME,c.SURNAME),
c.DATE_OF_BIRTH, c.SEX, a.ADDRESS_LINE1, a.ADDRESS_LINE2, a.ADDRESS_LINE3, a.ADDRESS_LINE4, '', a.POSTCODE, c.PPSN_NO, swr.scv_code
FROM proposal p, roleonproposal rop, client c, address a, scv_wn_roles swr
WHERE p.proposal_id = p_proposal_id
AND p.proposal_id = rop.proposal_id
AND rop.ROLE_ID <> v_Role
AND rop.CLIENT_ID = c.CLIENT_ID
AND c.CLIENT_ID = a.CLIENT_ID
AND p.PROPOSAL_ID = a.PROPOSAL_ID
AND rop.role_id = swr.id
AND p.company_id = swr.company_id;
Усеченный столбец - это swr.scv_code из таблицы scv_wn_roles. Возможны следующие значения ("WL1", "WL2", "WG", "WB", "WD", "WP", "WT", "WE"), но иногда вставляется только W.
Затем я перебираю курсор следующим образом:
FOR c_client IN cur_clients LOOP
И таблица, где роль вставляется как W, находится здесь:
INSERT INTO scv_policy_client_lookup spc
(spc.policy_number, spc.system_client_id, spc.qsclient_id, spc.role_id)
VALUES
(c_client.proposal_id, c_client.client_id, v_QS_id, c_client.scv_code);
Структура этих двух таблиц следующая:
create table SCV_WN_ROLES
(
ID NUMBER(10) not null,
REF_DESCRIPTION VARCHAR2(50),
COMPANY_ID NUMBER not null,
SCV_CODE CHAR(3)
);
А также,
create table SCV_POLICY_CLIENT_LOOKUP
(
POLICY_NUMBER VARCHAR2(42) not null,
SYSTEM_CLIENT_ID VARCHAR2(51) not null,
QSCLIENT_ID NUMBER(38,10) not null,
ROLE_ID VARCHAR2(4) not null,
COUNTRY_IND VARCHAR2(1) default 'R'
)
Столбец swr.scv_code вставляется в другие таблицы в хранимой процедуре, и в них он работает нормально, только эта таблица поиска.
Я попытался переместить значение курсора c_client.scv_code в локальную переменную VARCHAR2(3) и затем записать это в таблицу поиска, но это тоже не всегда работает.
Мы находимся на Oracle 11g, если это имеет значение.
Кто-нибудь заметил что-нибудь подозрительное?
Спасибо за помощь, mcquaim
1 ответ
Я понял это и, к счастью, это не было связано с приведенным выше кодом, думал, что я схожу с ума..
У нас есть ночное пакетное задание, которое выполняется в IBM Datastage & Qualitystage и присваивает уникальные идентификаторы клиента QS. Плохой дизайн этого пакетного задания означал, что он считывал все содержимое этой таблицы во временный набор данных, а затем записывал все обратно с новыми идентификаторами QS.
Проблема заключается в том, что временный набор данных допускает только 1 символ для идентификатора роли и, следовательно, усекает вышеуказанные роли.
Вставка выше на самом деле хорошо, но это ночная работа Datastage, которая вызывает проблемы.
Еще раз спасибо за всех, кто смотрел.