将sybase stuff函数转换为oracle

时间:2017-10-27 15:06:53

标签: sql oracle

Sybase查询:

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

Oracle Query:

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创建的代替具有on commit preserve的sybase临时表 行。

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

请帮忙。

3 个答案:

答案 0 :(得分:0)

你的别名是不对的。另外,请考虑使用INNER JOINS。

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 

答案 1 :(得分:0)

第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)

(未经测试)

答案 2 :(得分:0)

在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');