【问题标题】:SQL Server to Oracle conversionSQL Server 到 Oracle 的转换
【发布时间】:2017-12-06 05:18:56
【问题描述】:

我无法将此 SQL Server 代码转换为 Oracle 代码。我不是 SQL 专家,任何人都可以帮助将此代码转换为与 Oracle 兼容的代码。

 Declare @lvl as int
 Declare @rows as int
 DECLARE @foo as Table(
     KV_MANAGERNR int,
     KV_PERSONNR varchar(10),
     ord int,
     lvl int)

INSERT @foo (KV_MANAGERNR, KV_PERSONNR, ord, lvl)
select KV_MANAGERNR, KV_PERSONNR, row_number() over(order by KV_PERSONNR), 0
    from PERSONSMANAGER where KV_MANAGERNR='127723'

set @rows=@@ROWCOUNT
set @lvl=0

--Do recursion
WHILE @rows > 0
BEGIN
    set @lvl = @lvl + 1

    INSERT @foo (KV_MANAGERNR, KV_PERSONNR, ord, lvl)
    SELECT DISTINCT b.KV_MANAGERNR, b.KV_PERSONNR, row_number() over(order 
    by b.KV_PERSONNR), @lvl
    FROM PERSONSMANAGER b
     inner join @foo f on b.KV_MANAGERNR = f.KV_PERSONNR
     --might be multiple paths to this recursion so eliminate duplicates
     left join @foo dup on dup.KV_PERSONNR = b.KV_PERSONNR
     WHERE f.lvl = @lvl-1 and dup.KV_PERSONNR is null

    set @rows=@@ROWCOUNT 
END

SELECT DISTINCT KV_PERSONNR from @foo order by KV_PERSONNR

【问题讨论】:

  • 您遇到什么错误?
  • 在声明这些变量时在第 1 行和第 2 行出现语法错误。还有更多错误
  • 那么您是否尝试过了解如何在 Oracle 中声明变量?需要 1 次 Google 搜索才能发现它使用与 SQL Server 不同的语法。我的建议是你开始一个一个地解决错误。你可能会遇到下一个错误。如果您对此感到困惑,您可以随时发布带有特定请求的新问题。现在看起来好像您只是希望有人为您翻译代码。所以不是为了那个。我们乐于帮助您解决具体问题,但也有理由期待您能做出一些努力。
  • 请不要指望我们编写整个代码来节省您的时间。当您自己编写它时表现出一些努力,我们愿意提供帮助。您不必是 SQL 专家也可以尝试
  • 感谢 Schmitz 和 Kaushik。我试图转换代码。请检查我是否可以进一步改进它或是否存在任何错误。因为这段代码给了我结果。

标签: sql oracle11g sql-convert


【解决方案1】:
DECLARE  
    v_lvl Number:=0;  
    v_rows number:=1;  
BEGIN  
    INSERT INTO nt_list_0 (KV_MANAGERNR, KV_PERSONNR, ord, lvl)  
        select KV_MANAGERNR, KV_PERSONNR, row_number() over(order by 
        KV_PERSONNR), 0  from PERSONSMANAGER where KV_MANAGERNR='100047';  

    WHILE v_rows>0  
    LOOP  
        v_lvl := v_lvl +1;  

        INSERT INTO nt_list_0 (KV_MANAGERNR, KV_PERSONNR, ord, lvl)  
        SELECT DISTINCT b.KV_MANAGERNR, b.KV_PERSONNR, row_number() 
          over(order by b.KV_PERSONNR), v_lvl  
        FROM PERSONSMANAGER b  
        inner join nt_list_0 f on b.KV_MANAGERNR = f.KV_PERSONNR  
        left join nt_list_0 dup on dup.KV_PERSONNR = b.KV_PERSONNR  
        WHERE f.lvl = v_lvl-1 and dup.KV_PERSONNR is null;   

        v_rows := sql%rowcount;  
    END LOOP;  
END;

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2019-03-08
    • 2014-03-31
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2010-11-28
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多