从视图生成 create table DDL
Generate create table DDL from View
我有一个只读访问权限的 oracle 数据库,它公开视图供我使用,我想在本地数据库中插入上述数据。为此,我需要根据视图生成 create table 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);
作为我可以读取的数据库,我无法在其中创建 tables。
是否有任何工具允许 运行 这与 2 db 连接?那行得通吗?
编辑:对于那些不知道如何操作数据库的人来说Link这里有一个对我有用的垃圾一次性脚本
DECLARE
starting boolean := TRUE;
r_owner varchar2(30) := '';
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;
在您的本地数据库中,为 'read only' 数据库创建一个 link:
CREATE DATABASE LINK READONLY_DB
CONNECT TO scott IDENTIFIED BY tiger
USING 'readonlydb';
请注意,USING 'readonbly' 正在引用只读数据库的 tnsnames.ora 条目。将 'readonlydb' 替换为适当的正确值。
然后,创建数据库 link:
create table my_table as select * from readonly_table@readonly_db;
其中:
- 'readonly_table'表示只读数据库table的名称
- 'readonly_db'是您在第一步中创建的数据库link的名称。
我有一个只读访问权限的 oracle 数据库,它公开视图供我使用,我想在本地数据库中插入上述数据。为此,我需要根据视图生成 create table 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);
作为我可以读取的数据库,我无法在其中创建 tables。 是否有任何工具允许 运行 这与 2 db 连接?那行得通吗?
编辑:对于那些不知道如何操作数据库的人来说Link这里有一个对我有用的垃圾一次性脚本
DECLARE
starting boolean := TRUE;
r_owner varchar2(30) := '';
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;
在您的本地数据库中,为 'read only' 数据库创建一个 link:
CREATE DATABASE LINK READONLY_DB
CONNECT TO scott IDENTIFIED BY tiger
USING 'readonlydb';
请注意,USING 'readonbly' 正在引用只读数据库的 tnsnames.ora 条目。将 'readonlydb' 替换为适当的正确值。
然后,创建数据库 link:
create table my_table as select * from readonly_table@readonly_db;
其中:
- 'readonly_table'表示只读数据库table的名称
- 'readonly_db'是您在第一步中创建的数据库link的名称。