我正在尝试创建一个执行以下
的oracle过程transfer_table(table_name)
table_name
schema_a
table_name
中创建schema_a
为(copy
或select *
?)table_name@schema_b
我需要此过程是故障安全的:如果schema_a中不存在table_name,仍然继续将其创建为table_name @ schema_b的副本
这是我到目前为止所处的地方,但似乎没有运作良好......
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;
在我的工作方式中,我会感激任何帮助和任何优化。目标实际上是将表从模式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;
/
答案 0 :(得分:2)
pTableName || ' @ SCHEMA_B'
那是不对的。您需要将模式中的表引用为SCHEMA.TABLE_NAME
。
关于您的脚本,让我们一步一步地看到:
我是用户Lalit,我想创建一个表EMP作为模式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表不在用户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中有表EMP。
答案 1 :(得分:1)
您的更新代码存在一些问题 - 参数参数不需要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;