Запускать несколько операторов вставки с именем динамической схемы - PullRequest
2 голосов
/ 12 января 2012

Я хочу запустить 100 Вставить следующие операторы вставки в скрипт.Имя схемы db1 и db2 должно использоваться в переменных-заполнителях SourceDatabase и TargetDatabase.

DECLARE
SourceDatabase VARCHAR2(50) := 'DB1';
TargetDatabase VARCHAR2(50) := 'DB2';

BEGIN

Insert Into TargetDatabase.TableName (SELECT  * FROM SourceDatabase.TableName);
Insert Into TargetDatabase.TableName (SELECT  * FROM SourceDatabase.TableName);
Insert Into TargetDatabase.TableName (SELECT  * FROM SourceDatabase.TableName);
...
Commit

END;

Как я могу динамически записать, что Oracle принимает этот оператор?

Ответы [ 2 ]

4 голосов
/ 12 января 2012

Вы действительно имеете в виду «база данных» в определении термина Oracle? Или вы имеете в виду "схема"? Похоже, что опубликованный вами псевдокод предполагает, что SourceDatabase и TargetDatabase являются схемами в одной базе данных. Если вы действительно хотите указать, что они являются отдельными базами данных, вам потребуется использовать ссылки на базы данных для запросов к удаленным таблицам.

Предполагая, что вы имеете в виду схемы

DECLARE
  l_src_schema varchar2(30) := 'Source';
  l_dest_schema varchar2(30) := 'Destination';
  l_sql_stmt varchar2(4000);
BEGIN
  l_sql_stmt := 
    'INSERT INTO ' || l_dest_schema || '.table_name ' ||
    '  SELECT * FROM ' || l_src_schema || '.table_name';
  dbms_output.put_line( 'Preparing to execute: ' || l_sql_stmt;
  execute immediate l_sql_stmt;
END;

Обратите внимание, что обычно хорошей идеей является создание оператора динамического SQL в отдельной переменной, которую вы можете распечатать, потому что это значительно упрощает отладку кода. В противном случае, если есть ошибка, нет способа извлечь фактический оператор SQL, который ваш код пытался выполнить.

2 голосов
/ 12 января 2012

Вы должны будете использовать execute immediate.

DECLARE
SourceDatabase VARCHAR2(50) := 'DB1';
TargetDatabase VARCHAR2(50) := 'DB2';

BEGIN

execute immediate 'Insert Into '||  TargetDatabase || '.TableName 
                   (SELECT  * 
                      FROM ' || SourceDatabase || '.TableName)';
...
commit;

END;

или явно указать имя БД.

begin

   insert into DB2.TableName select * from DB1.TableName;
   commit;

end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...