PostgreSQL獲取建表語句儲存過程
PG版本:
PostgreSQL 11.11
儲存過程:
create or replace function get_tab_ddl(tab_name varchar)returns text as $$declare
--定義變數
tab_ddl text;
curs refcursor;
tmp_col record;
tab_info record;begin
--獲取表的pid、schema資訊
open curs for 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 ~ ('^('||tab_name||')$')AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2,3;
fetch curs into tmp_col;
--判斷是否存在該表
if tmp_col.oid is null then
return 'Table "'||tab_name||'" was not queried';
end if;
--如表存在,獲取表的列資訊
FOR tab_info IN
SELECT
a.attname as col_name,
pg_catalog.format_type(a.atttypid, a.atttypmod) as col_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 col_default_value,
CASE WHEN a.attnotnull = true THEN
'NOT NULL'
ELSE
'NULL'
END as col_not_null,
a.attnum as attnum,
e.max_attnum as max_attnum FROM
pg_catalog.pg_attribute a 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 a.attrelid=tmp_col.oid AND NOT a.attisdropped ORDER BY a.attnum --拼接為ddl語句
LOOP
IF tab_info.attnum = 1 THEN
tab_ddl:='CREATE TABLE '||tmp_col.nspname||'.'||tmp_col.relname||' (';
ELSE
tab_ddl:=tab_ddl||',';
END IF;
IF tab_info.attnum <= tab_info.max_attnum THEN
tab_ddl:=tab_ddl||chr(10)||' '||tab_info.col_name||' '||tab_info.col_type||' '||tab_info.col_default_value||' '||tab_info.col_not_null;
END IF;
END LOOP;
tab_ddl:=tab_ddl||');';
--輸出結果
RETURN tab_ddl;end;$$ language plpgsql;
用法:
select get_tab_ddl('table_name');
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2775718/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 儲存過程獲取表被引用的資訊儲存過程
- MySQL儲存過程語句及呼叫MySql儲存過程
- oracle之 獲取建表ddl語句Oracle
- oracle 儲存過程以及plsql語句塊Oracle儲存過程SQL
- Oracle 儲存過程中的DDL語句Oracle儲存過程
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- EF中使用SQL語句或儲存過程SQL儲存過程
- shell中獲取儲存過程返回值儲存過程
- 儲存過程 與 SQL Server語句大比拼儲存過程SQLServer
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- Oracle儲存過程乾貨(二):PLSQL控制語句Oracle儲存過程SQL
- 通過SQL語句提取儲存過程中的內容SQL儲存過程
- 用儲存過程把表裡的資料導成insert語句儲存過程
- 儲存過程語法儲存過程
- 獲取某庫某個儲存過程內容儲存過程
- 儲存過程if,for,while語句,陣列和遊標使用儲存過程While陣列
- Oracle儲存過程乾貨(三):PLSQL迴圈語句Oracle儲存過程SQL
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- 獲取物件的構建語句物件
- C++通過occi執行select語句、儲存過程、函式,取cursor值示例C++儲存過程函式
- 儲存過程基本語法儲存過程
- Mysql儲存過程 變數,條件,迴圈語句用法MySql儲存過程變數
- asp.net分頁的SQL語句及儲存過程ASP.NETSQL儲存過程
- mySQL語法中的儲存過程及if語句的使用簡例MySql儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- Oracle儲存過程基本語法Oracle儲存過程
- sql server儲存過程語法SQLServer儲存過程
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- 金倉資料庫KingbaseES儲存過程 RETURN語句資料庫儲存過程
- PostgreSQL的insert語句執行過程分析SQL
- Entity Framework Code First執行SQL語句、檢視及儲存過程FrameworkSQL儲存過程
- DDL語句在儲存過程中使用的細節和要點儲存過程
- MySQL儲存過程詳解 mysql 儲存過程MySql儲存過程
- 用儲存過程動態建立表儲存過程
- Mysql 獲取表設計查詢語句MySql
- 儲存過程儲存過程
- MyBatis 呼叫Oracle儲存過程,傳參、返回遊標的值獲取--示例MyBatisOracle儲存過程
- SQL SERVER 儲存過程 獲取三個數中的最大值SQLServer儲存過程