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

时间:2016-07-06 12:13:38

标签: oracle plsql oracle-sqldeveloper ddl

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

我使用的查询是:

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

IF(count_matching_tbl = 0)   然后     EXECUTE IMMEDIATE('CREATE TABLE testtable AS(SELECT A ,B。来自tab1 A JOIN tab2 B ON A.id = B.RID WHERE 1 = 2)');   万一; END;

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

请你的dba给出"选择dba_tables"你的架构。

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

答案 2 :(得分: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;
/