同时执行多个Oracle SQL语句
Execute multiple Oracle SQL statements simultaneously
我有一个 Oracle 数据库,它有 20 个非常大的 table,每个都有数百个分区。我可以压缩一个 table 但它需要 2 个多小时。这意味着需要 40 多个小时才能完成所有 20 tables。我想 运行 同时压缩分区(每个 table 压缩 1 个)。因为每天都会添加分区,所以我需要一个实用程序来在 运行 时生成 "alter table ..." 语法。到目前为止,我能想到的就是为 20 个 table 及其分区中的每一个创建一个 SQL,然后在 20 个 SQLPlus 会话中 运行 它们。
有没有更好、更自动化的方法来做到这一点?
您可以提交多个作业,这将依次 运行 您的代码 同时 。这是一个例子:
测试表 - 我想将 ID 的数据类型修改为 VARCHAR2(10)
SQL> create table t1 (id varchar2(2));
Table created.
SQL> create table t2 (id varchar2(2));
Table created.
SQL> create table t3 (id varchar2(2));
Table created.
将利用 EXECUTE IMMEDIATE
并从 DBMS_JOB
调用的过程(见下文):
SQL> create or replace procedure p_exe (par_what in varchar2) is
2 begin
3 execute immediate par_what;
4 end;
5 /
Procedure created.
创建将 运行 ALTER TABLE
同时
的工作
SQL> declare
2 l_str varchar2(200);
3 l_job number;
4 begin
5 for cur_r in (select 't1' table_name from dual union all
6 select 't2' from dual union all
7 select 't3' from dual)
8 loop
9 l_str := 'alter table ' || cur_r.table_name || ' modify id varchar2(10)';
10 dbms_output.put_line(l_str);
11 dbms_job.submit(l_job,
12 'p_exe(' || chr(39) || l_str || chr(39) ||');',
13 sysdate
14 );
15 commit;
16 end loop;
17 end;
18 /
PL/SQL procedure successfully completed.
工作现在 运行宁;稍后(在我的例子中,因为它很简单 - 你稍后会检查一下),检查正在做什么:
SQL> desc t1;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL> desc t3;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL> desc t3;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL>
我有一个 Oracle 数据库,它有 20 个非常大的 table,每个都有数百个分区。我可以压缩一个 table 但它需要 2 个多小时。这意味着需要 40 多个小时才能完成所有 20 tables。我想 运行 同时压缩分区(每个 table 压缩 1 个)。因为每天都会添加分区,所以我需要一个实用程序来在 运行 时生成 "alter table ..." 语法。到目前为止,我能想到的就是为 20 个 table 及其分区中的每一个创建一个 SQL,然后在 20 个 SQLPlus 会话中 运行 它们。
有没有更好、更自动化的方法来做到这一点?
您可以提交多个作业,这将依次 运行 您的代码 同时 。这是一个例子:
测试表 - 我想将 ID 的数据类型修改为 VARCHAR2(10)
SQL> create table t1 (id varchar2(2));
Table created.
SQL> create table t2 (id varchar2(2));
Table created.
SQL> create table t3 (id varchar2(2));
Table created.
将利用 EXECUTE IMMEDIATE
并从 DBMS_JOB
调用的过程(见下文):
SQL> create or replace procedure p_exe (par_what in varchar2) is
2 begin
3 execute immediate par_what;
4 end;
5 /
Procedure created.
创建将 运行 ALTER TABLE
同时
SQL> declare
2 l_str varchar2(200);
3 l_job number;
4 begin
5 for cur_r in (select 't1' table_name from dual union all
6 select 't2' from dual union all
7 select 't3' from dual)
8 loop
9 l_str := 'alter table ' || cur_r.table_name || ' modify id varchar2(10)';
10 dbms_output.put_line(l_str);
11 dbms_job.submit(l_job,
12 'p_exe(' || chr(39) || l_str || chr(39) ||');',
13 sysdate
14 );
15 commit;
16 end loop;
17 end;
18 /
PL/SQL procedure successfully completed.
工作现在 运行宁;稍后(在我的例子中,因为它很简单 - 你稍后会检查一下),检查正在做什么:
SQL> desc t1;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL> desc t3;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL> desc t3;
Name Null? Type
----------------------- -------- ----------------
ID VARCHAR2(10)
SQL>