【问题标题】:Converting the sybase stuff function in to oracle将 sybase stuff 函数转换为 oracle
【发布时间】:2017-10-27 15:06:53
【问题描述】:

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

请帮忙。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    (未测试)

    【讨论】:

    • 嗨,马特,上面的查询在 SQL 开发人员中工作,但是当我通过我的程序运行它时它失败了。请找出以下错误。 [Oracle][ODBC][Ora]ORA-01407:无法将 ("PEGASUSDB_SCHEMA"."TEMP_HORIZ_CALL_SIGN"."EFF_DAYS_Z") 更新为 NULL
    • @sandeep 抱歉,我不知道为什么在 IDE 之外运行时会出现 NULL
    【解决方案2】:

    你对你的别名不感兴趣。另外,请考虑使用 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 
    

    【讨论】:

    • 感谢您的回复。欣赏它。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回复。欣赏它
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2015-09-12
    • 2021-06-14
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多