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

这个问题非常普遍,但我面临一个问题,我无法找到答案 . 我要做的是,如果表不存在,创建一个表 . 但是在创建表时,我需要从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)

3 years ago

如果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

3 years ago

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

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

3 years ago

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