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

相关推荐
倔强的石头1063 小时前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库·oracle·kingbasees·金仓数据库·ksql
卷Java7 小时前
违规通知功能修改说明
java·数据库·微信小程序·uni-app
养生技术人8 小时前
Oracle OCP认证考试题目详解082系列第54题
数据库·sql·oracle·运维开发·database·开闭原则·ocp
数据知道9 小时前
Go基础:用Go语言操作MongoDB详解
服务器·开发语言·数据库·后端·mongodb·golang·go语言
爱喝白开水a9 小时前
2025时序数据库选型,从架构基因到AI赋能来解析
开发语言·数据库·人工智能·架构·langchain·transformer·时序数据库
羊锦磊9 小时前
[ Redis ] 数据结构储存系统
数据库·redis·缓存
m0_7415853510 小时前
网站框架
数据库
编程充电站pro11 小时前
SQL 子查询与多表 JOIN 用法大全(速查版)
数据库·sql
Dersun11 小时前
mysql数据库学习之常用函数(五)
数据库·sql·学习·mysql·ai编程