繁体   English   中英

将sybase填充函数转换为oracle

[英]Converting the sybase stuff function in to 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查询:

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命令未正确结束。

请帮忙。

您已关闭别名。 另外,请考虑改用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 

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

(未测试)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM