从视图生成 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的名称。