【问题标题】:Create a table in Oracle SQL If table does not exist using select and join在 Oracle SQL 中创建表如果表不存在使用 select 和 join
【发布时间】:2016-07-06 12:13:37
【问题描述】:

这个问题很常见,但我面临一个问题,我无法找到答案。 我要做的是,如果表不存在,则创建一个表。 但是在创建表时,我需要从选择查询(这是两个表的 JOIN 的结果)中创建它。 这是针对“ORACLE SQL DEVELOPER”/“PL/SQL”的。

我使用的查询是:

DECLARE
  count_matching_tbl BINARY_INTEGER := 0;  
BEGIN  
  SELECT COUNT(*)
  INTO count_matching_tbl
  FROM dba_tables 
  WHERE LOWER(table_name) = 'testtable';

  IF(count_matching_tbl = 0)
  THEN
    EXECUTE IMMEDIATE ( ' CREATE TABLE testtable AS (SELECT A.*, B.* from tab1 A JOIN tab2 B ON A.id = B.RID WHERE 1=2)');
  END IF;
END;

【问题讨论】:

  • 该查询有什么问题?你有错误吗?什么错误?它不做你想做的事吗?它在做什么或做得不对?虽然在运行时创建表通常表明架构不佳,但我的猜测是数据字典中的表名是大写的,而您正在 select 中寻找小写的表名。可能还有其他错误,或者可能是拼写错误。
  • @JustinCave:我得到的错误是'没有正确终止。并且由于代码的并行执行,if子句之后的其余语句都在之前执行,因此得到错误:表或​​视图不存在。
  • PL/SQL 块后缺少/stackoverflow.com/a/10207695/330315
  • 该代码对我来说很好,在 SQL*Developer 中运行。你是如何执行你的匿名块的?另外,我不明白您所说的并行执行代码是什么意思。这是 PL/SQL。它是程序性的 - 您的命令是串行而不是并行运行的。您的 IF 语句正在正确的时间处理。如果您解释了导致您不相信的原因,这可能对我们所有人都有帮助

标签: oracle plsql oracle-sqldeveloper ddl


【解决方案1】:

如果 tab1 和 tab2 表具有相同的名称列,则在创建表和插入记录时会出现歧义,因此而不是 * 替换添加到 testtable 中的表列,如

CREATE TABLE testtable AS (SELECT A.cola1, B.colb1 from tab1 A JOIN tab2 B ON A.id = B.RID WHERE 1=2

【讨论】:

  • 嗨桑杰,谢谢。但我仍然面临这个问题。 oracle SQl中还有一个并行执行的问题,在执行create table之前,IF子句之后的语句就被执行了,所以报错:table or view does not exist
【解决方案2】:

请您的 dba 将“select on dba_tables”提供给您的架构。

由于您使用的是 pl/sql 过程,因此您需要直接授予您权限,而不是通过角色授予。

【讨论】:

    【解决方案3】:

    问题在于静态 SQL 数据。 该表是动态创建的,但其余语句试图访问静态数据。 为了解决这个问题,我创建了两个匿名块,第一个具有 create table 语句,提交并结束块。 下一个匿名块将在 IF 子句之后执行其余语句。

    这解决了我的问题。

    DECLARE
    
      count_matching_tbl BINARY_INTEGER := 0;  
    
    BEGIN  
    
      SELECT COUNT(*)
      INTO count_matching_tbl
      FROM dba_tables 
      WHERE LOWER(table_name) = 'testtable';
    
      IF(count_matching_tbl = 0)
    
      THEN
    
        EXECUTE IMMEDIATE ( ' CREATE TABLE testtable AS (SELECT A.*, B.* from tab1 A JOIN tab2 B ON A.id = B.RID WHERE 1=2)');
    
      COMMIT;
    
      END IF;
    
    END;
    
    /
    
    BEGIN
    
    -- Rest of the database execution statements
    COMMIT;
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2019-11-03
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2011-08-23
      • 2012-03-09
      相关资源
      最近更新 更多