Oracle 过程删除 Table 作为参数并重新创建它

Oracle Procedure to Drop a Table as Argument and recreate it

我正在尝试创建一个执行以下操作的 oracle 过程transfer_table(table_name)

  1. schema_a
  2. 中删除 table_name
  3. schema_a 中创建 table_name 作为 table_name@schema_b
  4. 的(copyselect *?)

我需要这个过程是安全的:如果 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;