Oracle将表作为参数删除并重新创建它的过程

时间:2015-02-26 08:54:17

标签: oracle stored-procedures plsql

我正在尝试创建一个执行以下

的oracle过程transfer_table(table_name)
  1. table_name
  2. 中删除schema_a
  3. table_name中创建schema_a为(copyselect *?)table_name@schema_b
  4. 我需要此过程是故障安全的:如果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;
      /
    

2 个答案:

答案 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;