将 sybase stuff 函数转换为 oracle



Sybase query :

UPDATE #horizCallSign SET 
effDaysZ = STUFF( effDaysZ, csd.day+shift1, 1, '1')  
FROM #callSignTbl csd  
WHERE csd.legId1 = #horizCallSign.legId1  
AND   csd.legId2 = #horizCallSign.legId2  
AND   day = 28

甲骨文查询 :

UPDATE TEMP_HORIZ_CALL_SIGN  
SET  eff_Days_Z = REPLACE(  eff_days_Z,csd.day+shift1, '1')  
FROM temp_call_sign_table1 csd  
WHERE csd.leg_Id1 = temp_horiz_Call_Sign.leg_Id1  
AND   csd.leg_Id2 = horiz_Call_Sign.leg_Id2  
AND   day = 28 

在 Oracle 中,我们更改了列名,其中有"_"。temp_call_sign_table1和TEMP_HORIZ_CALL_SIGN是全局临时表为 Oracle 创建,以代替具有提交保留的 sybase 临时表行。

我们正在将 sybase DB 转换为 Oracle DB。当我在 oracle 中执行上述查询时,它说 QL 错误:ORA-00933:SQL 命令未正确结束。

请帮忙。

第 5 行的表名存在问题,使用别名可以轻松避免此问题。

此外,如果没有 SELECT,则无法在 Oracle 中使用 FROM。因此,在此实例中必须使用子查询。例如。。。

UPDATE TEMP_HORIZ_CALL_SIGN hcs 
SET eff_Days_Z =
(SELECT
    REPLACE(eff_days_Z,csd.day+shift1, '1')  
 FROM temp_call_sign_table1 csd  
 WHERE csd.leg_Id1 = hcs.leg_Id1  
 AND   csd.leg_Id2 = hcs.leg_Id2  
 AND   day = 28)

(未测试)

你的别名已经关闭了。此外,请考虑改用内部联接。

UPDATE THCS
SET  eff_Days_Z = REPLACE(  eff_days_Z,csd.day+shift1, '1')  
FROM temp_call_sign_table1 csd  , TEMP_HORIZ_CALL_SIGN THCS,  horiz_Call_Sign HCS
WHERE csd.leg_Id1 = THCS.leg_Id1  
AND   csd.leg_Id2 = HCS.leg_Id2  
AND   day = 28 

在 Oracle 中,您可以使用 MERGE INTO .

MERGE INTO temp_horiz_call_sign m
using (SELECT leg_id1,
              leg_id2,
              eff_days_z,
              day + shift1 plushift1
       FROM   temp_call_sign_table1
       WHERE  day = 28) r
ON ( r.leg_id1 = m.leg_id1
     AND r.leg_id2 = m.leg_id2 )
WHEN matched THEN
  UPDATE SET m.eff_days_z = Replace(m.eff_days_z, r.plushift1, '1');  

最新更新