【问题标题】:SQL Server procedure to Oracle procedure without using tool不使用工具的 SQL Server 过程到 Oracle 过程
【发布时间】:2020-05-27 16:26:23
【问题描述】:

有人可以帮助和指导我将以下 SQL Server 过程转换为 Oracle 过程吗?

CREATE PROCEDURE proc1 AS
BEGIN
    DECLARE @table1 TABLE (currency_id INT, amt_total_exp DECIMAL(18,4));
    DECLARE @table2 TABLE (contract_id INT);

    INSERT INTO @table2
        EXEC someProcedure 28, '28-11-2020';

    INSERT INTO @table1
        SELECT currency_id, SUM(amount_direct_exposure)
        FROM someTable d
        INNER JOIN @table2 c ON d.contract_id = c.contract_id   
        GROUP BY currency_id;

    SELECT * FROM @table1
END

SomeProcedure will provide result as follows

 contract_id
-------------
1
2
3
4
5

Someprocedure 中的日期参数用于列出特定方在该日期之前处于活动状态的contract_id

SomeProcedure 与@table1 无关。 @table1 用于保存 Someprocedure 的结果,以便在插入 @table2 时使用。

Proc1 在 SQL Server 中运行良好。我已经测试过了

【问题讨论】:

    标签: sql-server oracle plsql


    【解决方案1】:

    如果您发布示例数据以及 someprocedure 应该做什么,将会有所帮助。我它会将这些值插入table2,但是 - date 在这里做什么?不知道,所以省略了。

    我建议一个接受(至少一个)参数的过程:par_contract_id。它使程序可重用;使用硬编码的值,您只能使用一次(即使用硬编码的值集)。

    类似这样的:

    SQL> create or replace procedure proc1 (par_contract_id in number) as
      2  begin
      3    insert into table1 (currency_id, amt_total_exp)
      4      select s.currency_id,
      5             sum(s.amount_direct_exposure)
      6      from sometable s
      7      where s.contract_id = par_contract_id
      8      group by s.currency_id;
      9  end;
     10  /
    
    Procedure created.
    

    假设sometable 看起来像这样:

    SQL> select * from sometable;
    
    CONTRACT_ID AMOUNT_DIRECT_EXPOSURE CURRENCY_ID
    ----------- ---------------------- -----------
              1                    100         225
              1                    500         225
              2                    200         382
    

    contract_id = 1 传递给过程,它应该对100 + 500 求和并在table1 中插入一行:

    SQL> begin
      2    proc1(1);
      3  end;
      4  /
    
    PL/SQL procedure successfully completed.
    
    SQL> select * from table1;
    
    CURRENCY_ID AMT_TOTAL_EXP
    ----------- -------------
            225           600
    
    SQL>
    

    【讨论】:

    • SomeProcedure 将提供与party_id 关联的活动contract_id 列表 本质上,数据将是contract_id ------------------ 1 2 3 日期字段在某些程序中是列出截至该日期的有效合同。
    • 好的;因此,如果您必须在“someProcedure”中填充该“附加”表,请执行此操作。然后用“sometable”加入“附加”表。
    • 我会尝试改写这个词。在 proc1 中,我想调用 someProcedure ,它给出一个整数值列表。我想在临时表中插入这个整数值。我如何实现它
    • 在 someProcedure 中使用 INSERT INTO “临时表”语句。
    • 我不应该更改 SomeProcedure。这个想法是在proc1中使用一些过程的结果
    【解决方案2】:

    可以参考以下

    --1./创建两个临时全局的表-------

    create global temporary table table1 (currency_id number, amt_total_exp number);
    on commit delete rows;
    
    create global temporary table table2 (contract_id number);
    on commit delete rows;
    

    --2./ 创建产品 ----------

    CREATE PROCEDURE proc1 AS
        V_contract_id number;
    BEGIN
    
        V_contract_id := someProcedure(28, '28-11-2020');
    
        INSERT INTO table2
        (
            contract_id
        )
        VALUE 
        (
            V_contract_id
        );
    
        INSERT INTO table1
        SELECT currency_id, SUM(amount_direct_exposure)
        FROM 
        someTable d
        table2 c  
        WHERE 1=1 AND d.contract_id = c.contract_id  
        GROUP BY currency_id;
    
        --Output log --------------------------------
        FOR I IN (SELECT * FROM table1)
        LOOP
            DBMS_OUTPUT.PUT_LINE('currency_id: ' || I.currency_id);
            DBMS_OUTPUT.PUT_LINE('amt_total_exp: ' || I.amt_total_exp);
        END LOOP;
    
        COMMIT;
    END;
    

    【讨论】:

    • someProcedure(28, '28-11-2020');将返回多行。您的解决方案在这种情况下有效吗?
    • @Hung Le - 如果您使用 ANSI 标准 JOIN 语法进行连接会更好:'SELECT ... FROM someTable d join table2 c on d.contract_id = c.contract_id'
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2018-09-18
    • 2013-10-10
    • 2019-02-05
    • 2020-03-04
    相关资源
    最近更新 更多