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

我正在尝试创建一个oracle过程
transfer\u table(table\u name)
,它执行以下操作

  • schema\u a
  • schema\u a
    中创建
    table\u name
    ,作为
    表的(a
    copy
    select*
    ?)_name@schema_b
  • 我需要这个过程是故障安全的:如果模式a中不存在表名,仍然继续创建它作为表的副本_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
    放在表的末尾。如果它对您有帮助,请将其标记为已回答。