【发布时间】:2021-05-06 15:03:53
【问题描述】:
我有一个只读的 oracle 数据库,它公开视图供我使用,我希望在本地数据库中插入上述数据。为此,我需要基于视图生成创建表 DDL,但我发现没有办法做到这一点。
为了澄清我用过
SELECT dbms_metadata.get_ddl('VIEW','table','schema') FROM dual
该语句的结果是
CREATE OR REPLACE VIEW "SCHEMA"."VIEW_NAME" ("ID","NAME") AS
SELECT * FROM SQUARE S
JOIN SHAPE SH ON( S.ID==SH.ID)
我要生成的东西在哪里
CREATE TABLE table_name (
ID NUMBER,
NAME VARCHER2(100),
我也不能随便跑
CREATE TABLE new_table
AS (SELECT * FROM view WHERE 1=2);
作为我可以读取的数据库,我无法在其中创建表。 是否有任何工具允许使用 2 个 db 连接运行它?那行得通吗?
编辑:对于那些不知道如何做数据库的人,这里的链接是一个对我有用的垃圾一次性脚本
DECLARE
starting boolean := TRUE;
r_owner varchar2(30) := '$1';
r_table_name varchar2(30) := '';
BEGIN
FOR v IN ( --views from a owner
SELECT
VIEW_NAME
FROM
all_views
WHERE owner = r_owner)
LOOP
r_table_name:= v.view_name;
dbms_output.put_line('create table ' || r_owner || '.' || r_table_name || '(');
starting := TRUE;
FOR r IN ( -- columns from table
SELECT
column_name,
data_type,
data_length,
data_precision,
nullable
FROM
all_tab_columns
WHERE
table_name = upper(r_table_name)
AND owner = upper(r_owner)
ORDER BY column_id)
LOOP
IF starting THEN
starting := FALSE;
ELSE
dbms_output.put_line(',');
END IF;
IF r.data_type = 'NUMBER' THEN
IF r.data_length = 22 THEN
dbms_output.put(' '|| r.column_name || ' NUMBER');
ELSE
dbms_output.put(' '|| r.column_name || ' NUMBER(' || r.data_length || ')');
END IF;
ELSIF r.data_type = 'FLOAT' THEN
dbms_output.put(' '|| r.column_name || ' FLOAT(' || r.data_precision || ')');
ELSIF instr(r.data_type, 'CHAR') >0 then
dbms_output.put(' '|| r.column_name||' '||r.data_type||'('||r.data_length||')');
ELSE
dbms_output.put(' '|| r.column_name || ' ' || r.data_type);
END IF;
IF r.nullable = 'N' THEN
dbms_output.put(' NOT NULL');
END IF;
END LOOP;
dbms_output.put_line('');
dbms_output.put_line(' ); ');
dbms_output.put_line('');
END LOOP;
END;
【问题讨论】: