MathJax

MathJax-2

MathJax-3

Google Code Prettify

置頂入手筆記

EnterproseDB Quickstart — 快速入門筆記

由於考慮採用 EnterpriseDB 或是直接用 PostgreSQL 的人,通常需要一些入手的資料。這邊紀錄便提供相關快速上手的簡單筆記 ~ 這篇筆記以 資料庫安裝完畢後的快速使用 為目標,基本紀錄登入使用的範例:

2019年5月9日 星期四

把 SQL 查詢結果,存到 psql 的變數中

這是一個 psql 指令的 Scripting 強化功能,適用在 PGSQL 9.3 之後的 psql Client。

之前筆記中渡鴉之丘: 在 psql 指令界面下使用變數紀錄了 psql 指令裡面,如何使用 Meta-Variable 並指定一些值。到了 PGSQL 10 之後,psql 又擴增了 Meta-Variable 的能力,讓我們可以用 SQL 回傳結果當成 Meta-Variable 的值。

以下示範,是從 pg_settings 系統表查出 search_path 內容,然後把結果指定到 Meta-Variable。Meta-variable 的名稱,預設會使用回傳欄位名稱,這邊指定欄位名稱叫做 myvar,所以,Meta-variable 就叫做 myvar。
接著,就直接把結果,多增加一個 aaa 的 Schema,回頭指定到 search_path 裡面:
edb=# select setting as myvar from pg_settings where name='search_path' \gset
edb=# \echo :myvar
"$user", public
edb=# select :{?myvar};
 bool 
------
 t
(1 row)

edb=# set search_path = :myvar , aaa;
SET
edb=# show search_path ;
     search_path      
----------------------
 "$user", public, aaa
(1 row)

edb=# 

這招是對 show 指令也有效,但。。。用起來就怪怪的不舒服,原因是,Meta-Variable 名稱就叫做 search_path。。
edb=# show search_path \gset
edb=# select :{?search_path};
 bool 
------
 t
(1 row)

edb=# \echo :search_path
"$user", public
edb=# 

所幸~\gset 有一個搞笑功能:增加前綴字串。 這邊,就重新作一次,直接用 show 指令儲存結果到 Meta-Variable 裡面,並且 Meta-Variable 名稱叫做 var_search_path
edb=# show search_path \gset var_
edb=# select :{?var_search_path};
 bool 
------
 t
(1 row)

edb=# \echo :var_search_path
"$user", public
edb=# set search_path = :var_search_path , aaa;
SET
edb=# show search_path ;
     search_path      
----------------------
 "$user", public, aaa
(1 row)

edb=# 

如果 SQL 回傳的值不只一筆結果的話,就會無法存結果進 Meta-Variable
edb=# \d test
                Table "public.test"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 id     | integer |           |          | 

edb=# select * from test ;
 id 
----
(0 rows)

edb=# insert into test values (1),(2);
INSERT 0 2
edb=# select * from test ;
 id 
----
  1
  2
(2 rows)

edb=# select * from test \gset 
more than one row returned for \gset
edb=# 
edb=# select id from test \gset 
more than one row returned for \gset
edb=# select :{?id};
 bool 
------
 f
(1 row)

edb=# 





這個技巧另外的應用,則是增加 shared_preload_libraries 的內容
edb=# show shared_preload_libraries ;
                                           shared_preload_libraries                                           
--------------------------------------------------------------------------------------------------------------
 "$libdir/dbms_pipe", "$libdir/edb_gen", "$libdir/dbms_aq", "$libdir/sql-profiler", "$libdir/edb_wait_states"
(1 row)

edb=# show shared_preload_libraries \gset orig_
edb=# 
edb=# alter system set shared_preload_libraries = :orig_shared_preload_libraries , "$libdir/edb_filter_log";
ALTER SYSTEM
edb=# 

..重啟之後..
edb=# 
edb=# show shared_preload_libraries ;
                                                        shared_preload_libraries                                                        
----------------------------------------------------------------------------------------------------------------------------------------
 "$libdir/dbms_pipe", "$libdir/edb_gen", "$libdir/dbms_aq", "$libdir/sql-profiler", "$libdir/edb_wait_states", "$libdir/edb_filter_log"
(1 row)

edb=# 

值得注意的是,雖然 PGSQL 10 之後的 psql 指令才有這個功能,不過我們也是可以用「新版 psql」去連線到舊版資料庫的!然後,這樣的功能就可以套用到舊版資料庫(例如,Greenplum 5.x)了~

沒有留言:

張貼留言