南大通用GBase 8s 关于获取建表语句的函数

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

南大通用GBase 8s数据库中,我们可以通过建立一个函数的方法用来调用获取建表语句。

在gbase模式(set environment sqlmode 'gbase')下建如下函数:

sql 复制代码
Drop function if exists get_ddl(varchar);
create function get_ddl(p_name varchar(128))
returns lvarchar(16384)
define v_ddl lvarchar(16384);
define v_colname varchar(128);
define v_coltype_name varchar(128);
define v_nullable varchar(128);
define v_defvalue varchar(254);
define v_deftype varchar(10);
define v_ddl_pk lvarchar(16384);
define v_pk_collist lvarchar(16384);
define v_pk_name varchar(128);
on exception
return null;
end exception;

let p_name = lower(p_name);
let v_ddl = 'CREATE TABLE ' || p_name || '(' || chr(13) || chr(10);
let v_ddl_pk = null;
-- colname, coltype, nullable, default_value, default_type_flag
foreach SELECT tmp.colname,tmp.coltype_name,
CASE d.type
WHEN 'L' THEN gbasedbt.get_default_value(tmp.coltype, tmp.extended_id, tmp.collength, d.default::lvarchar(256))::VARCHAR(254)
WHEN 'C' THEN 'current year to second'::VARCHAR(254)
WHEN 'S' THEN 'dbservername'::VARCHAR(254)
WHEN 'U' THEN 'user'::VARCHAR(254)
WHEN 'T' THEN 'today'::VARCHAR(254)
WHEN 'E' THEN de.default::VARCHAR(254)
ELSE NULL::VARCHAR(254)
END AS def_value,
tmp.nullable,
d.type
INTO v_colname, v_coltype_name, v_defvalue, v_nullable, v_deftype
FROM (
SELECT ce.tabid, ce.colno, ce.colname,ce.coltype,ce.extended_id,ce.collength,ce.coltypename2::varchar(128) AS coltype_name,
CASE WHEN ce.coltype > 255 THEN 'NOT NULL' ELSE '' END AS nullable
FROM syscolumnsext ce, systables t
WHERE ce.tabid = t.tabid
AND t.tabname = p_name
ORDER BY ce.colno) tmp LEFT JOIN sysdefaults d ON (tmp.tabid = d.tabid AND tmp.colno = d.colno)
LEFT JOIN sysdefaultsexpr de ON (tmp.tabid = de.tabid AND tmp.colno = de.colno and de.type='T')

-- no column found, return null
if v_colname is null or v_colname = '' then
return null;
end if;

-- default values with function not do.
if v_deftype = 'E' then
let v_defvalue = 'DEFAULT (' || v_defvalue || ')';
elif v_deftype = 'L' and v_coltype_name[1,4] in ('CHAR','VARC','LVAR','NCHA','NVAR') then
let v_defvalue = 'DEFAULT ''' || v_defvalue || '''';
elif v_defvalue is not null then
let v_defvalue = 'DEFAULT ' || v_defvalue;
end if;

-- column: colname coltype default nullable
let v_ddl = v_ddl || ' ' || v_colname || ' ' || v_coltype_name || ' ' || v_defvalue || ' ' || v_nullable || ',' || chr(13) || chr(10);
end foreach;

-- primary key
let v_pk_collist = '';
let v_pk_name = '';
foreach SELECT
so.constrname,
rtrim((select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part1)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part2)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part3)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part4)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part5)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part6)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part7)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part8)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part9)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part10)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part11)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part12)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part13)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part14)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part15)) || ',' ||
(select sc.colname from syscolumns sc where sc.tabid = st.tabid and sc.colno = ABS(si.part16)), ',') as keys
INTO v_pk_name, v_pk_collist
FROM systables st, sysconstraints so, sysindexes si
WHERE st.tabname = p_name
AND st.tabid = so.tabid
AND so.constrtype = 'P'
AND so.idxname = si.idxname
end foreach;

if v_pk_collist = '' or v_pk_collist is null then
let v_ddl = rtrim(v_ddl, ',' || chr(13) || chr(10));
elif v_pk_name[1,1] = 'u' then
let v_ddl = v_ddl || ' PRIMARY KEY(' || v_pk_collist || ')';
else
let v_ddl = v_ddl || ' PRIMARY KEY(' || v_pk_collist || ') CONSTRAINT ' || v_pk_name ;
end if;
let v_ddl = v_ddl || chr(13) || chr(10) || ');';
return v_ddl;
end function;

使用示例:

sql 复制代码
--建表语句:
create table t1(id int, c1 varchar2(10), c2 blob, c3 clob);

--调用函数(oracle或gbase模式都可):
call get_ddl('t1');
--返回结果如下:
(EXPRESSION)  CREATE TABLE t1(
          id INTEGER   ,
          c1 VARCHAR2(10)  ,
          c2 BLOB   ,
          c3 CLOB   
         ); 

通过本文的介绍,我们希望帮助您更好地理解和使用南大通用GBase 8s数据库,轻松获取建表语句,如果您在使用过程中遇到任何问题或有任何建议,欢迎随时与我们交流,我们将竭诚为您提供支持。

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
Oo大司命oO31 分钟前
藏在正则表达式里的陷阱
数据库·mysql·正则表达式
_oP_i2 小时前
mysql统计数据库使用存储大小
数据库
会编程的土豆2 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
jjjava2.02 小时前
系统日志:从入门到精通的完整指南
网络·数据库
写代码的强哥2 小时前
云原生数据库与传统数据库相比“新”在哪里
数据库·云原生·架构
吴声子夜歌3 小时前
MongoDB 4.2——查询
数据库·mongodb
xieliyu.5 小时前
MySQL 存储过程详解:概念、创建与删除全教程
开发语言·数据库·mysql
ttwuai5 小时前
AI 生成后台删除按钮后,MySQL 软删除和唯一索引怎么验
数据库·mysql·golang
张人玉5 小时前
基于 Vue 3 + ECharts + Express + SQLite 构建的新能源汽车销量数据分析与可视化平台——新能源汽车销量数据分析系统
数据库·vue.js·sqlite·echarts