greenplum获取建表语句

CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar)
    RETURNS text AS
$BODY$
DECLARE
    v_table_ddl   text;
    column_record record;
BEGIN
    FOR column_record IN
        SELECT b.nspname                                       as schema_name,
               b.relname                                       as table_name,
               a.attname                                       as column_name,
               pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type,
               CASE
                   WHEN
                       (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                        FROM pg_catalog.pg_attrdef d
                        WHERE d.adrelid = a.attrelid
                          AND d.adnum = a.attnum
                          AND a.atthasdef) IS NOT NULL THEN
                           'DEFAULT ' || (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
                                          FROM pg_catalog.pg_attrdef d
                                          WHERE d.adrelid = a.attrelid
                                            AND d.adnum = a.attnum
                                            AND a.atthasdef)
                   ELSE
                       ''
                   END                                         as column_default_value,
               CASE
                   WHEN a.attnotnull = true THEN
                       'NOT NULL'
                   ELSE
                       'NULL'
                   END                                         as column_not_null,
               a.attnum                                        as attnum,
               e.max_attnum                                    as max_attnum
        FROM pg_catalog.pg_attribute a
                 INNER JOIN
             (SELECT c.oid,
                     n.nspname,
                     c.relname
              FROM pg_catalog.pg_class c
                       LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
              WHERE c.relname ~ ('^(' || p_table_name || ')$')
                AND pg_catalog.pg_table_is_visible(c.oid)
              ORDER BY 2, 3) b
             ON a.attrelid = b.oid
                 INNER JOIN
             (SELECT a.attrelid,
                     max(a.attnum) as max_attnum
              FROM pg_catalog.pg_attribute a
              WHERE a.attnum > 0
                AND NOT a.attisdropped
              GROUP BY a.attrelid) e
             ON a.attrelid = e.attrelid
        WHERE a.attnum > 0
          AND NOT a.attisdropped
        ORDER BY a.attnum
        LOOP
            IF column_record.attnum = 1 THEN
                v_table_ddl := 'CREATE TABLE ' || column_record.schema_name || '.' || column_record.table_name || ' (';
            ELSE
                v_table_ddl := v_table_ddl || ',';
            END IF;

            IF column_record.attnum <= column_record.max_attnum THEN
                v_table_ddl := v_table_ddl || chr(10) ||
                               '    ' || column_record.column_name || ' ' || column_record.column_type || ' ' ||
                               column_record.column_default_value || ' ' || column_record.column_not_null;
            END IF;
        END LOOP;

    v_table_ddl := v_table_ddl || ');';
    RETURN v_table_ddl;
END;
$BODY$ LANGUAGE plpgsql;
--测试
select generate_create_table_statement('t_sys_user') as sql;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值