在 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;
/
这个问题很常见,但我遇到了一个问题,但我找不到答案。 我要做的是,如果 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;
/