这个问题非常普遍,但我面临一个单一的问题,我无法找到答案。 我要做的是,如果表不存在,创建一个表。 但是在创建表时,我需要从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;
答案 0 :(得分:0)
如果tab1和tab2表具有相同的名称列,则在创建表和插入记录时会出现歧义,而不是像在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;
/