【问题标题】:Generate create table DDL from View从 View 生成 create table DDL
【发布时间】: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;

【问题讨论】:

    标签: sql oracle ddl


    【解决方案1】:

    在您的本地数据库中,创建指向“只读”数据库的链接:

    CREATE DATABASE LINK READONLY_DB 
    CONNECT TO scott IDENTIFIED BY tiger 
    USING 'readonlydb';
    

    注意,USING 'readonbly' 是为您的只读数据库引用 tnsnames.ora 条目。用适当的正确值替换“readonlydb”。

    然后,创建 db 链接:

    create table my_table as select * from readonly_table@readonly_db;
    

    地点:

    • 'readonly_table'代表只读数据库中的表名
    • 'readonly_db' 是您在第一步中创建的数据库链接的名称。

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多