首页 文章

在Oracle SQL中创建表如果使用select和join不存在表

提问于
浏览
0

这个问题非常普遍,但我面临一个问题,我无法找到答案 . 我要做的是,如果表不存在,创建一个表 . 但是在创建表时,我需要从select查询创建它(这是两个表的JOIN的结果) . 这适用于“ORACLE SQL DEVELOPER”/“PL / SQL” .

我正在使用的查询是:

DECLARE count_matching_tbl BINARY_INTEGER:= 0;
开始
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)');万一;结束;

3 回答

  • 0

    如果tab1和tab2表具有相同的名称列,那么在创建表和插入记录时会出现歧义,而不是像在testtable中添加的* replace table列那样

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

    请你的dba给你的架构“select on dba_tables” .

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

  • 0

    问题是因为静态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;
    /
    

相关问题