【发布时间】:2013-04-20 14:27:13
【问题描述】:
我在 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 的表在这里:
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。
有人发现了什么可疑的东西吗?
感谢您的帮助, 麦奎姆
【问题讨论】:
-
您确定您的表只有这 8 个角色值吗?当您使用局部变量时,您是否显示该变量以进行验证,如果是,则显示
W或更长的值? (为什么要混合CHAR(3)、VARCHAR(3)和VARCHAR(4)以获得相同的值?)我想知道您是否有错误的数据,或者其他东西稍后会截断它 - 如果您从表中选择返回的值它是否显示相同的 procW,还是只能在 proc 完成后观察到? -
嗨,亚历克斯,感谢您的回复。表中有 16 个角色,但针对不同的公司(1 和 4),但只有 8 个与我的测试相关。角色表是定义为 CHAR(3) 的现有表,因此除非需要,否则我不想更改它。你认为这可能是我的问题吗?如果我手动运行游标查询,我总是得到正确的角色值,从不被截断。如果我手动执行 Oracle SP,它一直有效,除了 1 次。我尝试在 PLSQL 中进行调试,即使定义了我的局部变量,它也从来没有错误的角色..
-
它是否只发生在只有两个字符的 scv_code 值???
-
不,它也发生在 WL1、WL2 或一些 2 字符值(如 WP 或 WE)中......
-
请注意,CHAR(3) 将用空格填充任何较短的内容。这意味着您的值将是('WL1','WL2','WG','WB','WD','WP','WT','WE')。使用比例字体很难看到,但在 2 个字符代码中的任何一个之后都有一个空格。
标签: oracle oracle11g cursor truncated