- ORA-01407:无法将(“PSOWNER”。“PS_VCHR_LINE_STG”。“CLASS_FLD”)更新为 NULL 失败的 SQL stmt:UPDATE

问题描述 投票:0回答:2

错误信息:

- ORA-01407: cannot update ("PSOWNER"."PS_VCHR_LINE_STG"."CLASS_FLD") to NULL Failed SQL stmt: UPDATE

当我生成报告时,它说 Peoplesoft 没有成功。

下面是Update语句的代码。

请帮助我如何克服这个问题。

UPDATE %Table(VCHR_LINE_STG) A 
  SET A.CLASS_FLD = ( 
 SELECT SUBSTR(DCP_FLD49 
 ,3 
 ,4) 
  FROM %Table(DCP_AP11_TMP2) 
 WHERE VCHR_BLD_KEY_C1 = A.VCHR_BLD_KEY_C1 
   AND DCP_FLD34= A.VOUCHER_LINE_NUM),A.BUSINESS_UNIT =( 
 SELECT D.CF_ATTRIB_VALUE 
  FROM %Table(CF_ATTRIB_TBL) D 
  , %Table(DEPT_TBL) E 
 WHERE ( D.EFFDT = ( 
 SELECT MAX(D_ED.EFFDT) 
  FROM %Table(CF_ATTRIB_TBL) D_ED 
 WHERE D.SETID = D_ED.SETID 
   AND D.CHARTFIELD_VALUE = D_ED.CHARTFIELD_VALUE 
   AND D_ED.EFFDT <= SYSDATE) 
   AND E.EFFDT=D.EFFDT 
   AND D.CHARTFIELD_VALUE = ( 
 SELECT M.DCP_FLD41 
  FROM %Table(DCP_AP11_TMP2) M 
 WHERE M.VCHR_BLD_KEY_C1 = A.VCHR_BLD_KEY_C1 
   AND M.DCP_FLD34= A.VOUCHER_LINE_NUM) 
   AND D.SETID = E.SETID 
   AND D.SETID = 'DCPID' 
   AND D.CF_ATTRIBUTE='AP_BUSN_UNIT' 
   AND E.EFFDT = ( 
 SELECT MAX(E_ED.EFFDT) 
  FROM %Table(DEPT_TBL) E_ED 
 WHERE E.SETID = E_ED.SETID 
   AND E.DEPTID = E_ED.DEPTID 
   AND E_ED.EFFDT <= SYSDATE) 
   AND E.DEPTID = D.CHARTFIELD_VALUE 
   AND E.SETID = D.SETID 
   AND E.EFF_STATUS='A')),A.BUSINESS_UNIT_GL=( 
 SELECT D.CF_ATTRIB_VALUE 
  FROM %Table(CF_ATTRIB_TBL) D 
  , %Table(DEPT_TBL) E 
 WHERE ( D.EFFDT = ( 
 SELECT MAX(D_ED.EFFDT) 
  FROM %Table(CF_ATTRIB_TBL) D_ED 
 WHERE D.SETID = D_ED.SETID 
   AND D.CHARTFIELD_VALUE = D_ED.CHARTFIELD_VALUE 
   AND D_ED.EFFDT <= SYSDATE) 
   AND E.EFFDT=D.EFFDT 
   AND D.CHARTFIELD_VALUE = ( 
 SELECT M.DCP_FLD41 
  FROM %Table(DCP_AP11_TMP2) M 
 WHERE M.VCHR_BLD_KEY_C1 = A.VCHR_BLD_KEY_C1 
   AND M.DCP_FLD34= A.VOUCHER_LINE_NUM) 
   AND D.SETID = E.SETID 
   AND D.SETID = 'DCPID' 
   AND D.CF_ATTRIBUTE='GL_BUSN_UNIT' 
   AND E.EFFDT = ( 
 SELECT MAX(E_ED.EFFDT) 
  FROM %Table(DEPT_TBL) E_ED 
 WHERE E.SETID = E_ED.SETID 
   AND E.DEPTID = E_ED.DEPTID 
   AND E_ED.EFFDT <= SYSDATE) 
   AND E.DEPTID = D.CHARTFIELD_VALUE 
   AND E.SETID = D.SETID  
   AND E.EFF_STATUS='A')) 
 WHERE EXISTS ( 
 SELECT 'X' 
  FROM %Table(DCP_AP11_TMP2) 
 WHERE VCHR_BLD_KEY_C1 = A.VCHR_BLD_KEY_C1 
   AND VOUCHER_LINE_NUM = A.VOUCHER_LINE_NUM)

以上是App Engine中Update语句的代码。

请帮助我如何克服这个问题。

提前致谢。

peoplesoft peoplesoft-app-engine
2个回答
0
投票

填充每个字段的子选择没有返回值,因此数据库正在尝试将该字段更新为 NULL。在 PeopleSoft 中,字符字段中不允许出现空值。没有值的字段需要设置为单个空格,例如 ' '。

您将需要使用 COALESCE() 函数包装每个子选择,如果子选择不返回值,则使用非空替代选项。字符字段需要设置为 ' ',如果没有返回值,数字字段需要设置为 0。日期字段可以为空。这是使用所提供代码的前几行的示例。

    UPDATE %Table(VCHR_LINE_STG) A 
    SET A.CLASS_FLD = 
      COALESCE(
        (SELECT SUBSTR(DCP_FLD49,3,4) 
         FROM %Table(DCP_AP11_TMP2) 
         WHERE VCHR_BLD_KEY_C1 = A.VCHR_BLD_KEY_C1 
         AND DCP_FLD34= A.VOUCHER_LINE_NUM), ' ')
    , A.BUSINESS_UNIT_GL=(SELECT
    ...

0
投票

我会这样做:将 SELECT 语句复制粘贴到 SQL Developer 中 - 并解析“%”部分 - 并将 Select 更改为 * 以便可以看到所有字段。

然后希望您会看到导致此问题的不良数据。

我假设您在 PS 交付的工作中遇到了这个麻烦。这种事情发生在我们身上 - 坏数据不会被 Online PeopleSoft 页面捕获 - 因此作业会因丢失数据而失败。或者只是在线页面中发生了一些奇怪的事情 - 网络故障 - 谁知道 - 并且数据丢失了。

这是我的建议 - 尝试捕获 SELECT 语句以查找错误数据。

最美好的祝愿!

© www.soinside.com 2019 - 2024. All rights reserved.