【问题标题】:Cursor column value randomly getting truncated?光标列值随机被截断?
【发布时间】: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) 以获得相同的值?)我想知道您是否有错误的数据,或者其他东西稍后会截断它 - 如果您从表中选择返回的值它是否显示相同的 proc W,还是只能在 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


【解决方案1】:

我想通了,谢天谢地它与上面的代码无关,以为我要疯了..

我们有一个在 IBM Datastage 和 Qualitystage 上运行的夜间批处理作业,它分配唯一的 QS 客户端 ID。这个批处理作业的糟糕设计意味着它将这个表的全部内容读入一个临时数据集中,然后用新的 QS ID 再次将其全部写回。

问题是临时数据集只允许角色 ID 使用 1 个字符,因此会截断上述角色。

上面的插入实际上很好,但它是导致问题的隔夜 Datastage 作业。

再次感谢所有观看的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多