powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов файла SQL скрипта в цикле
17 сообщений из 17, страница 1 из 1
Вызов файла SQL скрипта в цикле
    #39352971
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе всем!
Не подскажите ли как решить следующую задачу.
В различных схемах выполнить однотипный скрипт ( создание таблиц и наполнению их данными)
Была идея следующая, в цикле переключать схему и вызывать скрипт @'D:\OMP\TEST_TABLE.sql' (закомментирован)
, который будет выполняться под требуемым пользователем

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15); 
  enSchem tGeoshema;
   total integer;
 
 
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
   total := enSchem.count;
   FOR i in 1 .. total LOOP
   execute immediate 'alter session set current_schema='||enSchem(i);
--execute immediate  @'D:\OMP\TEST_TABLE.sql';
-- @'D:\OMP\TEST_TABLE.sql';
     END LOOP;
END;


Но похоже так нельзя :)
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39352975
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL/SQL выполняется на стороне сервера, поэтому он не сможет запустить TEST_TABLE.sql
Сначала, наверное, нужно из TEST_TABLE.sql сделать хранимую процедуру на стороне сервера.
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39352978
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Ryndin,
Да,тоже так подумал,спасибо.
Скрипт, сгенеренный софтом, который требовалось размножить на однотипные схемы.
Хотел не плодить процедуры
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39352983
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorSmAlexander Ryndin,
Да,тоже так подумал,спасибо.
Скрипт, сгенеренный софтом, который требовалось размножить на однотипные схемы.
Хотел не плодить процедурызачем плодить процедуры? Одну процедуру, в которой execute immediate делаются.
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353029
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorSm,

Скрипт a.sql (можно сгенерить)
Код: plsql
1.
2.
3.
4.
5.
6.
spool my_log.log
@b.sql vasya vasya_pwd my_instance
@b.sql petya petya_pwd my_instance
...
spool off
exit



Скрипт b.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
whenever sqlerror exit 1
whenever oserror exit 2
connect &1/&2@&3

Prompt Connected to &1

create table t (n number);
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353057
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока сделал так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15); 
  enSchem tGeoshema;
   total integer;
   
  
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
   total := enSchem.count;
   FOR i in 1 .. total LOOP
   dbms_output.put_line('alter session set current_schema='||enSchem(i)||';');
   dbms_output.put_line('@'||'''D:\OMP\TEST_TABLE.sql'''||';');
     END LOOP;
END;



Т.е генерю скрипт вида
Код: plsql
1.
2.
3.
4.
alter session set current_schema=shema1;
 @'D:\OMP\TEST_TABLE.sql';
alter session set current_schema=shema2;
 @'D:\OMP\TEST_TABLE.sql';


.....
и потом исполняю
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353076
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эхх, а в скриптах генерируемых софтом
Куда не посмотри
Код: plsql
1.
select USER||'.'||'TABLE_NAME' from dual;


не подходит alter session set current_schema
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353100
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не далее как полтора года назад разгоняли N-поточный ETL в идентичных структурах...

Есть возможность пройти replace 'ом по файлу?
1. делается replace
Код: sql
1.
  "USER||'."   ->   "'&&username..'" 



2. пишется скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set serveroutput on size 10000
spool run.sql

DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15); 
  enSchem tGeoshema;
   total integer;
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
   total := enSchem.count;
   FOR i in 1 .. total LOOP
   dbms_output.put_line('define username ="'||upper(enSchem(i))||'"');
   dbms_output.put_line('@'||'D:\OMP\TEST_TABLE.sql');
     END LOOP;
END;


сие сгенерит скрипт run.sql

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
define username ="SHEMA1"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA2"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA3"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA4"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA5"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA6"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA7"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA8"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA9"
@D:\OMP\TEST_TABLE.sql
define username ="SHEMA10"
@D:\OMP\TEST_TABLE.sql



3. запускаем полученный скрипт run.sql - PROFIT!
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353106
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжу монолог. В итоге, некрасиво, но работает :)

----
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15);
  TYPE tGeoshemaPW IS VARRAY(10) OF VARCHAR2(90); 
  enSchem tGeoshema;
  enSchemPW tGeoshemaPW;
   total integer;
    
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
  enSchemPW := tGeoshemaPW('shema1/pw','shema2/pw','shema3/pw','shema4/pw','shema5/pw','shema6/pw','shema7/pw','shema8/pw','shema9/pw','shema10/pw');  
   total := enSchem.count;
   FOR i in 1 .. total LOOP
   dbms_output.put_line('alter session set current_schema='||enSchem(i)||';');
   dbms_output.put_line('@'||'''D:\OMP\CREATE_TABLE.sql'''||';');
  dbms_output.put_line('CONNECT '||enSchemPW(i)||';');
  dbms_output.put_line('@'||'''D:\OMP\INSERT_TABLE.sql'''||';');
     END LOOP;
END;


Где CREATE_TABLE.sql- генерируемый софтом, который создает таблицы,
INSERT_TABLE вставка в одноименные таблицы значений
Использование CONNECT обусловлено использованием в INSERT_TABLE повсеместного select USER||'.'||'TABLE_NAME' from dual;
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353108
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHist,

Спасибо. Не заметил ответа
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353172
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итого 2 скрипта
Предыдущий вариант не подходил так как после переключения в пользовательскую схему, например shema1
таблицы через alter session уже не создавались

Первый под пользователем с правами на создание таблиц, генерирующий через alter session
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15);
  TYPE tGeoshemaPW IS VARRAY(10) OF VARCHAR2(90); 
  enSchem tGeoshema;
  enSchemPW tGeoshemaPW;
   total integer;
    
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
  enSchemPW := tGeoshemaPW('shema1/pw','shema2/pw','shema3/pw','shema4/pw','shema5/pw','shema6/pw','shema7/pw','shema8/pw','shema9/pw','shema10/pw');  
   total := enSchem.count;
   FOR i in 1 .. total LOOP
   dbms_output.put_line('alter session set current_schema='||enSchem(i)||';');
   dbms_output.put_line('@'||'''D:\OMP\CREATE_TABLE.sql'''||';');
     END LOOP;
END;



2-й на заполнение, через c_connect_tn
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15);
  TYPE tGeoshemaPW IS VARRAY(10) OF VARCHAR2(90); 
  enSchem tGeoshema;
  enSchemPW tGeoshemaPW;
   total integer;
    
BEGIN
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
  enSchemPW := tGeoshemaPW('shema1/pw','shema2/pw','shema3/pw','shema4/pw','shema5/pw','shema6/pw','shema7/pw','shema8/pw','shema9/pw','shema10/pw');  
   total := enSchem.count;
   FOR i in 1 .. total LOOP
  dbms_output.put_line('CONNECT '||enSchemPW(i)||';');
  dbms_output.put_line('@'||'''D:\OMP\INSERT_TABLE.sql'''||';');
     END LOOP 
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353175
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2-й на заполнение, через CONNECT
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353178
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня такая поделка есть: http://orasql.org/2013/04/09/sqlplus-tips-3-iterators-and-recursions/
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353179
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но не более чем 20 раз может рекурсивно вызываться
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353180
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но отселектить нужное количество @скрипт конечно проще
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353193
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Спасибо. Посмотрю
...
Рейтинг: 0 / 0
Вызов файла SQL скрипта в цикле
    #39353211
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И стоит добавить имя сервера

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE
  TYPE tGeoshema IS VARRAY(10) OF VARCHAR2(15);
  TYPE tGeoshemaPW IS VARRAY(10) OF VARCHAR2(90); 
  enSchem tGeoshema;
  enSchemPW tGeoshemaPW;
   total integer;
      mysid varchar(15);
BEGIN
mysid:='@server';
 enSchem := tGeoshema('shema1','shema2','shema3','shema4','shema5','shema6','shema7','shema8','shema9','shema10');
  enSchemPW := tGeoshemaPW('shema1/pw','shema2/pw','shema3/pw','shema4/pw','shema5/pw','shema6/pw','shema7/pw','shema8/pw','shema9/pw','shema10/pw');  
   total := enSchem.count;
   FOR i in 1 .. total LOOP
  dbms_output.put_line('CONNECT '||enSchemPW(i)||mysid||';');
  dbms_output.put_line('@'||'''D:\OMP\INSERT_TABLE.sql'''||';');
     END LOOP 
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов файла SQL скрипта в цикле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]