南大通用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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
洲覆11 分钟前
go-mysql-transfer 伪装从库实现 MySQL 到 Redis 数据同步(完整配置)
数据库·redis·mysql·golang
谅望者23 分钟前
SQL 自连接详解:当数据表需要与自己对话(组织层级实战)
数据库·sql·mysql·oracle·database
姚远Oracle ACE36 分钟前
解读 “SQL ordered by Physical Reads (UnOptimized)“
数据库·sql·oracle
山峰哥37 分钟前
KingbaseES 表空间与模式优化策略深度研究报告
开发语言·数据结构·数据库·oracle·深度优先
九转苍翎1 小时前
深入解析MySQL(6)——存储过程、游标与触发器
数据库·mysql
武子康1 小时前
Java-164 MongoDB 认证与权限实战:单实例与分片集群 整体认证配置实战 最小化授权/错误速查/回滚剧本
java·数据库·分布式·mongodb·性能优化·系统架构·nosql
金仓拾光集1 小时前
《MongoDB 重建索引要锁库?金仓却能边跑边修》
数据库·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库
金仓拾光集1 小时前
金仓数据库平替MongoDB:医共体数据互通的高效安全之道
数据库·安全·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库
南棱笑笑生1 小时前
20251031在Ubuntu24.04.2中文版下使用diff命令查找两份SDK的差异并删除同样的部分以便比对awk
数据库·sqlserver