SQL Серверная процедура до Oracle процедуры без использования инструмента - PullRequest
0 голосов
/ 27 мая 2020

Может ли кто-нибудь помочь и посоветовать мне преобразовать приведенную ниже SQL серверную процедуру в 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 сервере. Протестировал

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Будет полезно, если вы разместите образцы данных, а также то, что должен делать someprocedure. Я догадываюсь, что он вставляет эти значения в table2, но - что здесь делает дата? Понятия не имею, поэтому я его опускаю.

Я бы предложил процедуру, которая принимает (хотя бы один) параметр: 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>
0 голосов
/ 27 мая 2020

Вы можете обратиться к следующему

- 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 Produre - --------

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;
...