我在oracle存储过程中有一个游标,它随机截断其中一个返回列中的值。
我看不到任何模式,有时候它会有效,它只是将值截断为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;
要截断的列是表scv_wn_roles中的swr.scv_code。它的可能值是('WL1','WL2','WG','WB','WD','WP','WT','WE')但插入的内容有时只是W。
然后按如下方式遍历游标:
FOR c_client IN cur_clients LOOP
将W作为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 :(得分:0)
我明白了,谢天谢地,这与上面的代码无关,以为我疯了......
我们有一个夜间批处理作业,可在IBM Datastage&amp; Qualitystage,它分配独特的QS客户端ID。这个批处理作业的糟糕设计意味着它正在将该表的全部内容读入临时数据集,然后使用新的QS ID再次将其全部写回。
问题是临时数据集只允许角色ID使用1个字符,从而截断上述角色。
上面的插入实际上很好,但它是导致问题的隔夜Datastage工作。
再次感谢任何看过的人。