Как создать процедуру с указанным c предложением WITH в Oracle? - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема с созданием Procdure с указанным c предложением WITH. Я использую базу данных Oracle. Мне нужна временная таблица для отображения определенных значений c во время выполнения.

Вот мое предложение WITH (оно представляет собой своего рода отображение между старой схемой базы данных и новой схемой базы данных для моих конкретных c вариантов использования):

WITH myTempTable AS (
   SELECT *
   FROM
   (
       SELECT 'myFirstOldSchema'  AS OLD_SCHEMA, 'myFirstNewSchema'  AS NEW_SCHEMA  FROM dual UNION
       SELECT 'mySecondOldSchema' AS OLD_SCHEMA, 'mySecondNewSchema' AS NEW_SCHEMA  FROM dual UNION
       SELECT 'myThirdOldSchema'  AS OLD_SCHEMA, 'myThirdNewSchema'  AS NEW_SCHEMA  FROM dual
   )
)

Кроме того, я иметь следующую Oracle процедуру. Эта процедура будет создана и выполнена путем внесения в базу данных:

DECLARE

    PROCEDURE myProcedure(schema in varchar2) AS
        BEGIN
            EXECUTE IMMEDIATE 'INSERT INTO ' || schema || '.myTable(column_1, column_2, column_3) 
            (
              SELECT extern_column_1,
                     extern_column_2,
                     extern_column_3
              FROM ' || schema || '.myExternTable
            )';
        END;

BEGINN

    FOR S IN (SELECT * FROM ROOT_SCHEMA.myTableWithSchema)
      LOOP
        myProcedure(S.mySchemata);
      END LOOP
      COMMIT;

END;
/

Теперь мне нужно решение, похожее на следующее:

DECLARE

    PROCEDURE myProcedure(schema in varchar2) AS
        BEGIN
            WITH myTempTable AS (
                SELECT *
                FROM
                (
                    SELECT 'myFirstOldSchema'  AS OLD_SCHEMA, 'myFirstNewSchema'  AS NEW_SCHEMA  FROM dual UNION
                    SELECT 'mySecondOldSchema' AS OLD_SCHEMA, 'mySecondNewSchema' AS NEW_SCHEMA  FROM dual UNION
                    SELECT 'myThirdOldSchema'  AS OLD_SCHEMA, 'myThirdNewSchema'  AS NEW_SCHEMA  FROM dual
                )
            )

            -- Here a specific value from column "OLD_SCHEMA" must be inserted  
            EXECUTE IMMEDIATE 'INSERT INTO ' || (SELECT OLD_SCHEMA FROM myTempTable WHERE OLD_SCHEMA = schema) || '.myTable(column_1, column_2, column_3)
            (
              SELECT extern_column_1,
                     extern_column_2,
                     extern_column_3
              -- Here a specific value from column "NEW_SCHEMA" must be inserted
              FROM ' || (SELECT NEW_SCHEMA FROM myTempTable WHERE OLD_SCHEMA = schema) || '.myExternTable 
            )';
        END;

BEGINN

    FOR S IN (SELECT * FROM ROOT_SCHEMA.myTableWithSchema)
      LOOP        
        -- First  loop S.mySchemata represent the value 'myFirstOldSchema'
        -- Second loop S.mySchemata represent the value 'mySecondOldSchema'
        -- Third  loop S.mySchemata represent the value 'myThirdOldSchema'
        myProcedure(S.mySchemata);
      END LOOP
      COMMIT;

END;
/

Процедура должна выдать следующее SQL Заявления для базы данных:

INSERT INTO myFirstOldSchema.myTable(column_1, column_2, column_3)
(
    SELECT extern_column_1,
           extern_column_2,
           extern_column_3
    FROM myFirstNewSchema.myExternTable 
);

INSERT INTO mySecondOldSchema.myTable(column_1, column_2, column_3)
(
    SELECT extern_column_1,
           extern_column_2,
           extern_column_3
    FROM mySecondNewSchema.myExternTable 
);

INSERT INTO myThirdOldSchema.myTable(column_1, column_2, column_3)
(
    SELECT extern_column_1,
           extern_column_2,
           extern_column_3
    FROM myThirdNewSchema.myExternTable 
);

Как я могу создать такую ​​Oracle SQL процедуру? Большое спасибо за помощь!

1 Ответ

1 голос
/ 28 апреля 2020

Используйте ваше предложение WITH в курсоре FOR l oop в своей процедуре:

DECLARE
  PROCEDURE myProcedure(pinSchema IN VARCHAR2) AS
  BEGIN
    FOR aRow IN (WITH t AS (SELECT 'myFirstOldSchema'  AS OLD_SCHEMA,
                                   'myFirstNewSchema'  AS NEW_SCHEMA
                              FROM DUAL UNION ALL
                            SELECT 'mySecondOldSchema' AS OLD_SCHEMA,
                                   'mySecondNewSchema' AS NEW_SCHEMA
                              FROM DUAL UNION ALL
                            SELECT 'myThirdOldSchema'  AS OLD_SCHEMA,
                                   'myThirdNewSchema'  AS NEW_SCHEMA
                              FROM DUAL)
                  SELECT t.*
                   FROM t
                   WHERE t.OLD_SCHEMA = pinSchema)
    LOOP
      -- Here a specific value from column "OLD_SCHEMA" must be inserted  

      EXECUTE IMMEDIATE 'INSERT INTO ' || aRow.OLD_SCHEMA ||
                          '.myTable(column_1, column_2, column_3)
                           (SELECT extern_column_1,
                                   extern_column_2,
                                   extern_column_3
                             FROM ' || aRow.NEW_SCHEMA || '.myExternTable)';
    END LOOP;
  END myProcedure;

BEGIN
  FOR S IN (SELECT * FROM ROOT_SCHEMA.myTableWithSchema)
  LOOP        
    -- First  loop S.mySchemata represent the value 'myFirstOldSchema'
    -- Second loop S.mySchemata represent the value 'mySecondOldSchema'
    -- Third  loop S.mySchemata represent the value 'myThirdOldSchema'
    myProcedure(S.mySchemata);
  END LOOP

  COMMIT;    
END;

Не тестировано на животных - вы будете первым!

...