<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # <span style="font-size:15px">**擴展開發基本步驟** </span> * 在源碼目錄的`contrib/`目錄下創建與擴展名同名的文件夾,在該文件夾內存放開發好的擴展源碼文件,包含MakeFile文件、.sql文件、.control控制文件等 * 在該目錄下,執行`make`命令,進行編譯 * 將編譯生成的so文件和sql文件遷移至安裝目錄的lib和extension下 * 將so文件和sql文件修改權限和用戶組 * 最后再在數據庫中添加擴展:`create extension 擴展名;` # <span style="font-size:15px">**擴展開發使用的語言** </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostgreSQL 支持使用`PL/pgSQL`語言或者原生的C語言開發擴展。`PL/pgSQL`開發相對簡單,但性能上較原生的C語言要差。只需要通過指定sql文件的`CREATE FUNCTION`的`LANGUAGE`參數即可。 # <span style="font-size:15px">**實例一:使用SQL語言實現自定義擴展** </span> 1、在源碼目錄的`contrib/`目錄下創建與擴展名同名的文件夾,在該文件夾內,創建`demo--1.0.sql`文件,定義add函數,實現數值相加,其中`LANGUAGE`參數設置為`SQL` ``` -- 如果腳本是由 psql 而不是 CREATE EXTENSION 執行,則報錯 -- \echo開始的行,會被擴展機制認為是注釋行,如果腳本文件被送給psql而不是由CREATE EXTENSION載入,這種機制通常被用來拋出錯誤 \echo Use "CREATE EXTENSION" to load this file. \quit CREATE FUNCTION add(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; ``` 2、創建`demo.control`文件 ``` comment = create add function' # 添加擴展注釋 default_version = '1.0' # 指定默認擴展版本 relocatable = false # 設置擴展是否可重定向 ``` 3、創建`Makefile`文件 ``` EXTENSION = demo DATA = demo--1.0.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) ``` 4、`make && make install` ``` [postgres@izwz91quxhnlkan8kjak5hz demo]$ l demo--1.0.sql demo.control Makefile [postgres@izwz91quxhnlkan8kjak5hz demo]$ make && make install make: 對“all”無需做任何事。 /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/install -c -m 644 .//demo.control '/www/server/postgresql/share/extension/' /usr/bin/install -c -m 644 .//demo--1.0.sql '/www/server/postgresql/share/extension/' ``` 5、`create extension demo` ``` [postgres@izwz91quxhnlkan8kjak5hz demo]$ psql Password: psql (13.0) Type "help" for help. postgres=# create extension demo; CREATE EXTENSION ``` 6、測試驗證 ``` // 查詢語句中直接調用擴展的函數,自定義擴展函數正常生效 postgres=# SELECT id,name,sale,num,add(sale,num) from test WHERE id =2; id | name | sale | num | add ----+-------+------+-----+----- 2 | z4Vuo | 3 | 3 | 6 (1 row) ``` 7、為demo擴展新增multi函數(乘法算法),并將擴展版本更新為1.1 當前demo擴展安裝的版本為1.0,可通過pg_extension查看 ``` postgres=# select * from pg_extension where extname='demo'; oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition -------+---------+----------+--------------+----------------+------------+-----------+-------------- 16628 | demo | 10 | 2200 | t | 1.0 | | (1 row) ``` 在demo擴展目錄下新增demo--1.0--1.1.sql升級腳本,并更改Makefile的DATA 參數:增加demo--1.0--1.1.sql ``` [postgres@izwz91quxhnlkan8kjak5hz demo]$ ls demo--1.0--1.1.sql demo--1.0.sql demo.control Makefile [postgres@izwz91quxhnlkan8kjak5hz demo]$ cat demo--1.0--1.1.sql -- 如果腳本是由 psql 而不是 CREATE EXTENSION 執行,則報錯 -- \echo開始的行,會被擴展機制認為是注釋行,如果腳本文件被送給psql而不是由CREATE EXTENSION載入,這種機制通常被用來拋出錯誤 \echo Use "CREATE EXTENSION" to load this file. \quit CREATE FUNCTION multi(integer, integer) RETURNS integer AS 'select $1 * $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; [postgres@izwz91quxhnlkan8kjak5hz demo]$ cat Makefile EXTENSION = demo DATA = demo--1.0.sql demo--1.0--1.1.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) ``` 執行`make install`并執行`ALTER EXTENSION`命令將demo擴展版本更新到1.1 ``` [postgres@izwz91quxhnlkan8kjak5hz demo]$ make install /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/install -c -m 644 .//demo.control '/www/server/postgresql/share/extension/' /usr/bin/install -c -m 644 .//demo--1.0.sql .//demo--1.0--1.1.sql '/www/server/postgresql/share/extension/' [postgres@izwz91quxhnlkan8kjak5hz ~]$ psql Password: psql (13.0) Type "help" for help. postgres=# ALTER EXTENSION demo update to '1.1'; ALTER EXTENSION postgres=# SELECT * from pg_extension where extname='demo'; oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition -------+---------+----------+--------------+----------------+------------+-----------+-------------- 16628 | demo | 10 | 2200 | t | 1.1 | | (1 row) ``` > 如執行 ALTER EXTENSION 發現以下報錯。需檢查Makefile的DATA參數是否有寫新的腳本文件 > postgres=# ALTER EXTENSION demo update to '1.1'; > ERROR: extension "demo" has no update path from version "1.0" to version "1.1" > 此報錯說明該擴展沒有升級路徑,可通過此命令查看: > ``` > postgres=# SELECT * FROM pg_extension_update_paths('demo'); > source | target | path > --------+--------+------ > (0 rows) > ``` Makefile和sql文件填寫正確后,在make install之后,該擴展就會自動更新其升級路徑 ``` postgres=# SELECT * FROM pg_extension_update_paths('demo'); source | target | path --------+--------+---------- 1.0 | 1.1 | 1.0--1.1 1.1 | 1.0 | (2 rows) ``` 8、升級后的版本功能測試:新增了multi函數(乘法算法),且功能正常,擴展版本也成功更新為1.1 ``` postgres=# SELECT id,name,sale,num,add(sale,num),multi(sale,num) from test WHERE id =2; id | name | sale | num | add | multi ----+-------+------+-----+-----+------- 2 | z4Vuo | 3 | 3 | 6 | 9 (1 row) ``` # <span style="font-size:15px">**實例二:使用c語言實現自定義擴展** </span> 1、創建add_test擴展的相關文件 ``` [postgres@izwz91quxhnlkan8kjak5hz add_test]$ pwd /postgresql/postgresql-13.0/contrib/add_test [postgres@izwz91quxhnlkan8kjak5hz add_test]$ ls add_test--1.0.sql add_test.c add_test.control Makefile ``` 2、add_test--1.0.sql :聲明擴展的函數、該函數的字符串常量以及使用的語言 ``` [postgres@izwz91quxhnlkan8kjak5hz add_test]$ cat add_test--1.0.sql \echo Use "create EXTENSION add_test" to load this file. quit CREATE FUNCTION add(integer, integer) RETURNS integer AS '$libdir/add_test' LANGUAGE C STRICT IMMUTABLE; ``` 3、add_test.c:編寫c腳本,實現擴展的自定義函數邏輯 ``` #include "postgres.h" //包含 PostgreSQL 基礎的接口。這是開發 PostgreSQL 擴展必需包含的頭文件 #include "fmgr.h" // 包含了PG_GETARG_XX和PG_RETURN_XX等獲取參數和返回結果的重要的宏,是必需的 #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; //?從 PostgreSQL 8.2版本后就必須的宏,必須寫在#include "fmgr.h"之后 #endif PG_FUNCTION_INFO_V1(add); // PG_FUNCTION_INFO_V1宏聲明了我們所定義的函數為 Version-1 約定的函數,需要在定義方法之前先進行聲明 Datum add(PG_FUNCTION_ARGS); Datum add(PG_FUNCTION_ARGS) // Datum?等同于void,表示函數返回任意類型的數據 { int sum,a,b; a = PG_GETARG_INT32(0); // 獲取函數的第一個參數的值,并且將其轉換為 int 類型 b = PG_GETARG_INT32(1); sum = a + b; PG_RETURN_INT32(sum); // 將結果轉換為 int 類型并返回,也有其他類型的返回值:float、json } ``` 4、add_test.control:編寫控制文件,定義默認版本號以及設置是否可重定向 ``` [postgres@izwz91quxhnlkan8kjak5hz add_test]$ cat add_test.control # demo extension comment = 'custom add function' default_version = '1.0' relocatable = true ``` 5、Makefile ``` [postgres@izwz91quxhnlkan8kjak5hz add_test]$ cat Makefile MODULE_big = add_test OBJS = add_test.o EXTENSION = add_test DATA = add_test--1.0.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) ``` 6、make install ``` [postgres@izwz91quxhnlkan8kjak5hz add_test]$ make install gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -I. -I./ -I/www/server/postgresql/include/server -I/www/server/postgresql/include/internal -D_GNU_SOURCE -c -o add_test.o add_test.c gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -shared -o add_test.so add_test.o -L/www/server/postgresql/lib -Wl,--as-needed -Wl,-rpath,'/www/server/postgresql/lib',--enable-new-dtags /usr/bin/mkdir -p '/www/server/postgresql/lib' /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/mkdir -p '/www/server/postgresql/share/extension' /usr/bin/install -c -m 755 add_test.so '/www/server/postgresql/lib/add_test.so' /usr/bin/install -c -m 644 .//add_test.control '/www/server/postgresql/share/extension/' /usr/bin/install -c -m 644 .//add_test--1.0.sql '/www/server/postgresql/share/extension/' ``` 7、添加擴展并測試 ``` postgres=# create extension add_test; CREATE EXTENSION postgres=# select id,name,age,sale,num,add(sale,num) from test limit 1; id | name | age | sale | num | add ----+-------+-----+------+-----+----- 2 | z4Vuo | 4 | 3 | 3 | 6 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看