Oracle将表作为参数删除并重新创建它的过程
我正在尝试创建一个oracle过程Oracle将表作为参数删除并重新创建它的过程,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我正在尝试创建一个oracle过程transfer\u table(table\u name),它执行以下操作 在schema\u a 在schema\u a中创建table\u name,作为表的(acopy或select*?)_name@schema_b 我需要这个过程是故障安全的:如果模式a中不存在表名,仍然继续创建它作为表的副本_name@schema_b 这就是我到目前为止所做的,但它似乎工作不好 create or replace PROCEDURE transfer_table
transfer\u table(table\u name)
,它执行以下操作
schema\u a
schema\u a
中创建table\u name
,作为表的(acopy
或select*
?)_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;
/
pTableName | |“@SCHEMA_B”
那是不对的。您需要将架构中的表引用为schema.table\u NAME
关于您的脚本,让我们逐步了解:
我是用户Lalit,我想创建一个表EMP,作为来自schema 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表。您的更新代码有一些问题-参数参数不需要varchar的长度。还有一个额外的结尾。嵌套匿名块没有异常关键字 应该是这样的:
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;
您已经标记了,但是您已经编写了PL/SQL&T的混合-SQL@Sathya-那我真的迷路了。这是给Oracle的,我一直在搜索网页,可能拿错了…嗨-事实上,我使用@SCHEMA_B是因为它是一个数据库链接。。。我应该说,在…@Stephane的变量声明
@pTableName NVARCHAR(128)
也不正确之前-第一个字符应该是@
符号,它应该是nvarchar2
@Stephane,如果另一个对象在不同的数据库中,您可以使用dblink。但是,您确定没有将模式引用为数据库吗?因为我在SQL Server开发人员中看到了这种混乱。肯定是dblink!但如果它确实是一个不同的数据库,那么您可以将其称为schema。table@dblink
。脚本中没有太大的变化,只需将@dblink
放在表的末尾。如果它对您有帮助,请将其标记为已回答。