2013-04-26 3 views
0

У меня есть курсор в хранимой процедуре оракула, которая случайным образом усекает значение в одном из возвращаемых столбцов.Значение столбца курсора случайным образом усекается?

Я не вижу ни одного шаблона для этого, иногда он работает в других случаях, он просто усекает значение до 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

+0

Вы абсолютно уверены, что ваша таблица имеет только те 8 значений ролей? Когда вы использовали локальную переменную, вы отобразили ее для проверки, и если бы это показало «W» или более длинное значение? (Почему вы смешиваете 'CHAR (3)', 'VARCHAR (3)' и 'VARCHAR (4)' за одно и то же значение?) Мне интересно, есть ли у вас плохие данные или что-то еще усекает их позже - если вы выбираете значение обратно из таблицы в том же proc, что оно показывает 'W', или вы можете только наблюдать, что после завершения proc? –

+0

Привет, Алекс, спасибо за ответ.В таблице есть 16 ролей, но для разных компаний (1 и 4), но только те 8, которые подходят для моего теста. Таблица ролей - это существующая таблица, которая была определена как CHAR (3), поэтому я не хотел ее менять, если это не требуется. Считаете ли вы, что это может быть моей проблемой? Если я запускаю запрос курсора вручную, я ВСЕГДА получаю правильные значения роли, никогда не усекающиеся. Если я вручную выполняю Oracle SP, он всегда работал, кроме 1 раза. Я пробовал отлаживать в PLSQL, и он никогда не выполнял эту роль, даже если моя локальная переменная определена. – mcquaim

+0

это происходит только для значений scv_code, которые имеют только два символа ??? – psaraj12

ответ

0

Я понял это и к счастью это не было связано с выше коде, думал, что я схожу с ума ..

У нас есть ночные пакетное задание, которое выполняет на IBM Datastage & Qualitystage и присваивает уникальные идентификаторы клиента QS. Плохая конструкция этого пакетного задания означала, что он считывал все содержимое этой таблицы во временный набор данных, а затем записывал все это снова с новыми идентификаторами QS.

Проблема заключается в том, что временный набор данных допускает только 1 символ для идентификатора роли и, таким образом, усекает указанные выше роли.

Вставка выше на самом деле прекрасна, но это задание Datastage в течение ночи, которое вызывает проблемы.

Еще раз спасибо за каждого, кто посмотрел.

Смежные вопросы