【问题标题】:Query from Oracle 10g to 11g从 Oracle 10g 到 11g 查询
【发布时间】:2018-05-22 01:14:42
【问题描述】:

我正在使用Oracle 11g 开发自动化。我有以下查询在oracle 10g 上运行良好,但在 11 上运行良好。

update(
    select rirr.NUM_SERIE_ULT, 
           tri.T_USED_IMEI, 
           rirr.celular, 
           tri.MSISDN, 
           rirr.TRAFICO,
           case when rirr.celular =  tri.MSISDN then 'MISMO ABONADO' 
                when rirr.celular <> tri.MSISDN then 'OTRO ABONADO' 
                else 'SIN TRAFICO'
           end  as TRAFICO_ACTUALIZAR 
    from RENOVACIONES_INT_RENO_REPO rirr
         left join TRAFICO_RENOVACION_INTERNA tri
         on rirr.NUM_SERIE_ULT = tri.T_USED_IMEI
    )
set TRAFICO = TRAFICO_ACTUALIZAR;

【问题讨论】:

  • 欢迎来到 SO。请详细说明什么不是“工作”
  • 要备份 OldProgrammer,我们知道查询不起作用,但请提供更多详细信息。你是否收到一个错误,如果你是什么。它是否像您期望的那样运行但没有更新(并且没有错误)?请提供更多信息。
  • 当我运行这个查询时,会出现下一个错误:“ORA-01779:无法修改映射到非键保留表的列。”当我将 oracle 10g 升级到 11g 时开始出现此错误
  • 那么,你在 11g 中拥有 10g 中的所有约束吗?

标签: sql database oracle oracle11g oracle10g


【解决方案1】:

错误:

您正在从表 rirr 更新列 TRAFICO(不是实际的表名,而是您在查询中使用的别名)。此表在连接条件 rirr.NUM_SERIE_ULT = tri.T_USED_IMEI 上连接到表 tri

对于rirr 中的每一行,Oracle 必须在tri 中找到满足连接条件的唯一行。这意味着:表rirr 中的列NUM_SERIE_ULT 可能有重复项;但是表tri 中的列T_USED_IMEI 必须是唯一的(不能有重复项)。此外,在 Oracle 使用连接执行 UPDATE 语句时,表tri 需要(并且我相信在 Oracle 10 中)在列T_USED_IMEI 上具有唯一索引或唯一约束。如果 UPDATE 语句在 Oracle 10 中有效,那么很可能您有这样的索引或约束。

Oracle 11 中是否还存在这样的索引或约束?如果您所做的只是升级,则不应删除/删除索引或约束;但这就是错误消息的含义...

不相关的观察:

在 UPDATE 的 SELECT 子查询中选择 other 列有什么意义?即:rirr.NUM_SERIE_ULT, tri.T_USED_IMEI, rirr.celular, tri.MSISDN。前两个出现在join条件中;另外两个出现在TRAFICO_ACTUALIZAR 的定义中。但这并不意味着您需要这四列中的任何列也单独出现在SELECT 列表中。

【讨论】:

  • 嗨,Mathguy,前面的语句在 Oracle 10 上运行良好,但我不知道当 dba 升级到 11 时,很多查询停止工作,我理解这个问题,我不在乎其他列。我只想用另一个表的值更新一个表(case 语句)。但是在这个 momnet 中我不知道如何修改这个查询。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
相关资源
最近更新 更多