Oracle 过程删除 Table 作为参数并重新创建它
Oracle Procedure to Drop a Table as Argument and recreate it
我正在尝试创建一个执行以下操作的 oracle 过程transfer_table(table_name)
- 在
schema_a
中删除 table_name
- 在
schema_a
中创建 table_name
作为 table_name@schema_b
的(copy
或 select *
?)
我需要这个过程是安全的:如果 table_name 在 schema_a 中不存在,仍然继续创建它作为 table_name@[=40 的副本=]
这是我到目前为止的进展,但似乎效果不佳...
create or replace
PROCEDURE transfer_table
(
@pTableName NVARCHAR(128)
)
IS
BEGIN
execute immediate
'DROP TABLE '|| pTableName;
execute immediate
'CREATE TABLE '||pTableName|| ' AS SELECT * FROM ' || pTableName || '@SCHEMA_B';
END;
感谢您对我做事方式的任何帮助和优化。目标实际上是将 table 从模式 B 复制到模式 A,作为过程
更新后的代码 - 仍然无法正确编译:
create or replace
PROCEDURE transfer_table
(
table_name VARCHAR2(30)
)
IS
BEGIN
BEGIN
execute immediate
'DROP TABLE '|| table_name;
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
end;
END;
EXECUTE IMMEDIATE
'CREATE TABLE '||table_name|| ' AS SELECT * FROM ' || table_name || '@SCHEMA_B';
END;
/
pTableName || '@SCHEMA_B'
这是不正确的。您需要在架构中将 table 引用为 SCHEMA.TABLE_NAME
.
关于你的脚本,我们一步步来看:
我是用户 Lalit,我想创建一个 table EMP 作为相同 table 模式 SCOTT 的副本。
SQL> SHOW USER
USER is "LALIT"
SQL> SELECT * FROM lalit.emp;
SELECT * FROM lalit.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(*) from SCOTT.EMP;
COUNT(*)
----------
14
因此,它确认 EMP table 不在用户 LALIT 中,而是在 SCOTT 中。我现在将创建它:
SQL> DECLARE
2 table_name VARCHAR2(30);
3 schema_name varchar2(30);
4 BEGIN
5 table_name:='EMP';
6 schema_name:='SCOTT';
7 begin
8 EXECUTE IMMEDIATE
9 'DROP TABLE '|| table_name;
10 EXCEPTION
11 WHEN OTHERS THEN
12 IF SQLCODE != -942 THEN
13 RAISE;
14 END IF;
15 end;
16 EXECUTE IMMEDIATE
17 'CREATE TABLE '||table_name|| ' AS SELECT * FROM ' || schema_name||'.'||table_name || '';
18 END;
19 /
PL/SQL procedure successfully completed.
让我们确认一下:
SQL> select count(*) from lalit.emp;
COUNT(*)
----------
14
SQL>
所以,我现在在架构 LALIT 中有 table EMP。
您的更新代码有一些问题 - 参数参数不需要 varchar 的长度。还有一个额外的结局。嵌套的匿名块没有 EXCEPTION 关键字
应该是这样的:
CREATE OR REPLACE PROCEDURE transfer_table(table_name IN VARCHAR2) IS
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
EXECUTE IMMEDIATE 'CREATE TABLE ' || table_name || ' AS SELECT * FROM ' || table_name || '@SCHEMA_B';
END transfer_table;
我正在尝试创建一个执行以下操作的 oracle 过程transfer_table(table_name)
- 在
schema_a
中删除 - 在
schema_a
中创建table_name
作为table_name@schema_b
的(
table_name
copy
或 select *
?)
我需要这个过程是安全的:如果 table_name 在 schema_a 中不存在,仍然继续创建它作为 table_name@[=40 的副本=]
这是我到目前为止的进展,但似乎效果不佳...
create or replace
PROCEDURE transfer_table
(
@pTableName NVARCHAR(128)
)
IS
BEGIN
execute immediate
'DROP TABLE '|| pTableName;
execute immediate
'CREATE TABLE '||pTableName|| ' AS SELECT * FROM ' || pTableName || '@SCHEMA_B';
END;
感谢您对我做事方式的任何帮助和优化。目标实际上是将 table 从模式 B 复制到模式 A,作为过程
更新后的代码 - 仍然无法正确编译:
create or replace
PROCEDURE transfer_table
(
table_name VARCHAR2(30)
)
IS
BEGIN
BEGIN
execute immediate
'DROP TABLE '|| table_name;
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
end;
END;
EXECUTE IMMEDIATE
'CREATE TABLE '||table_name|| ' AS SELECT * FROM ' || table_name || '@SCHEMA_B';
END;
/
pTableName || '@SCHEMA_B'
这是不正确的。您需要在架构中将 table 引用为 SCHEMA.TABLE_NAME
.
关于你的脚本,我们一步步来看:
我是用户 Lalit,我想创建一个 table EMP 作为相同 table 模式 SCOTT 的副本。
SQL> SHOW USER
USER is "LALIT"
SQL> SELECT * FROM lalit.emp;
SELECT * FROM lalit.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select count(*) from SCOTT.EMP;
COUNT(*)
----------
14
因此,它确认 EMP table 不在用户 LALIT 中,而是在 SCOTT 中。我现在将创建它:
SQL> DECLARE
2 table_name VARCHAR2(30);
3 schema_name varchar2(30);
4 BEGIN
5 table_name:='EMP';
6 schema_name:='SCOTT';
7 begin
8 EXECUTE IMMEDIATE
9 'DROP TABLE '|| table_name;
10 EXCEPTION
11 WHEN OTHERS THEN
12 IF SQLCODE != -942 THEN
13 RAISE;
14 END IF;
15 end;
16 EXECUTE IMMEDIATE
17 'CREATE TABLE '||table_name|| ' AS SELECT * FROM ' || schema_name||'.'||table_name || '';
18 END;
19 /
PL/SQL procedure successfully completed.
让我们确认一下:
SQL> select count(*) from lalit.emp;
COUNT(*)
----------
14
SQL>
所以,我现在在架构 LALIT 中有 table EMP。
您的更新代码有一些问题 - 参数参数不需要 varchar 的长度。还有一个额外的结局。嵌套的匿名块没有 EXCEPTION 关键字
应该是这样的:
CREATE OR REPLACE PROCEDURE transfer_table(table_name IN VARCHAR2) IS
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
EXECUTE IMMEDIATE 'CREATE TABLE ' || table_name || ' AS SELECT * FROM ' || table_name || '@SCHEMA_B';
END transfer_table;