在 Oracle SQL 中创建一个 table 如果 table 不存在使用 select 并加入

Create a table in Oracle SQL If table does not exist using select and join

这个问题很常见,但我遇到了一个问题,但我找不到答案。 我要做的是,如果 table 不存在,则创建一个 table。 但是在创建 table 时,我需要从 select 查询(这是两个 table 的 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;

如果 tab1 和 tab2 table 具有相同的名称列,则在创建 table 和插入记录时会出现歧义,因此而不是 * 替换在 test[=13 中添加的 table 列=]喜欢

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

请您的 dba 为您的架构提供 "select on dba_tables "。

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

问题是由于静态 SQL 数据造成的。 table 是动态创建的,但其余语句试图访问静态数据。 为了解决这个问题,我创建了两个匿名块,第一个有 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;
/