У меня проблема с созданием 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 процедуру? Большое спасибо за помощь!