模擬 Oracle RDBMS 中的函式和包子集的函式和運算子。
有一個關聯的 Google 群組 - https://groups.google.com/forum/?hl=en#!forum/orafce-general
Orafce 在具有 PostgreSQL 相容性的 AWS Aurora 以及 Azure Database for PostgreSQL 中支援。
該模組包含一些有用的函數,可以幫助將 Oracle 應用程式移植到 PostgreSQL 或通常有用。
內建 Oracle 日期函數已針對 Oracle 10 進行了一致性測試。從 1960 年到 2070 年的日期範圍可以正常運作。由於 Oracle 中的錯誤,無法驗證 1582-10-05 之前的「J」格式日期和 1100-03-01 之前的其他格式日期。
所有函數都與 Oracle 完全相容,並遵循所有已知的格式字串。詳細的描述可以在網路上找到。使用下列關鍵字:oracle round trunc date iyyy。
Y,YY,YYY,YYYY,SYYY,SYEAR 年 I,IY,IYY,IYYY iso 年 問,季度 WW 週、日作為一年的第一天 IW 週,從週一開始 W 週,日為每月的第一天 DAY,DY,D 一週的第一天,星期日 月、週一、MM、RM 月 CC、SCC世紀 DDD,DD,J 天 HH、HH12、HH24 小時 心肌梗塞分鐘
函數四捨五入。也就是說,7 月 1 日的日期將四捨五入到下一年。 7月16日將四捨五入到8月。
add_months(date, integer) date - 回傳日期加上 n 個月
add_months(日期 '2005-05-31',1) -> 2005-06-30
last_date(date) date - 根據日期值傳回該月的最後一天
last_day(日期 '2005-05-24') -> 2005-05-31
next_day(date, text) date - 傳回大於日期值的第一個工作日
next_day(日期 '2005-05-24', '星期一') -> 2005-05-30
next_day(日期, 整數) 日期 - 與上方相同。第二個參數應該是 1..7 並解釋為 Sunday..Satday。
next_day(日期 '2005-05-24', 1) -> 2005-05-30
Months_ Between(date, date) numeric - 傳回 date1 與 date2 之間的月數。如果計算小數月份,則 Months_ Between 函數將根據 31 天的月份計算小數。
Months_ Between(日期 '1995-02-02', 日期 '1995-01-01') -> 1.0322580645161
trunc(date, text) date - 根據指定格式截斷日期
trunc(日期 '2005-07-12', 'iw') -> 2005-07-11
round(date, text) date - 將根據指定的格式舍入日期
回合(日期 '2005-07-12', 'yyyy') -> 2006-01-01
to_date(text) 時間戳記 - 將輸入文字轉換為時間戳記。 GUC orafce.nls_date_format 用於指定此函數的輸入文字格式。如果值留空或設定為 DEFAULT,則根據 PostgreSQL 的 datestyle GUC 設定輸入文字格式。
orafce.nls_date_format 值為 DEFAULT
to_date('2014-05-19 17:23:53+5:30') -> 2014-05-19 17:23:53
orafce.nls_date_format='YYYY-MMDD HH24:MI:SS'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
to_date(text, text) timestamp - 將具有指定格式的輸入文字轉換為時間戳記。 GUC orafce.orafce_emit_error_on_date_bug
用於指定當日期值遇到 Oracle 日期錯誤時是否報告錯誤。當使用'J'
格式 ( 'J2299159'
) 時,此錯誤會出現在1582-10-05
之前的日期;使用其他格式時,會在1100-03-01
之前出現此錯誤。預設會報告錯誤,若要停用此行為, set orafce.orafce_emit_error_on_date_bug to off
。
SELECT oracle.to_date('112012', 'J'); 錯誤:由於 Oracle 中的錯誤,無法驗證 1582-10-05(“J2299159”)之前的日期。 SELECT oracle.to_date('1003-03-15', 'yyyy-mm-dd'); 錯誤:由於 Oracle 中的錯誤,無法驗證 1100-03-01 之前的日期。 將 orafce.oracle_compatibility_date_limit 設定為關閉; SELECT oracle.to_date('112012', 'J'); 迄今 ------------------------ 4407-07-30 00:00:00 西元前 (1 行) SELECT oracle.to_date('1003/03/15', 'yyyy/mm/dd'); 迄今 -------------------- 1003-03-15 00:00:00 (1 行)
此模組包含與oracle相容的DATE資料類型「oracle.date」的實作以及使用DATE資料類型的函數,如oracle.add_months、oracle.last_day()、oracle.next_day()、oracle.months_ Between()等。
例子:
將 search_path 設定為 oracle,"$user", public, pg_catalog; 創建表 oracle_date(col1 日期); 插入 oracle_date 值('2014-06-24 12:12:11'::date); 從 oracle_date 選擇 *; 第 1 列 -------------------- 2014-06-24 12:12:11 (1 行)
oracle.add_months(timestamp with time zone, integer) - 傳回日期與時間加上 n 個月
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(timestamp with time zone) - 根據日期值傳回該月的最後一天
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 2005-05-31 11:12:12
oracle.next_day(timestamp with time zone, text) - 傳回大於日期值的第一個工作日
oracle.next_day(oracle.date '2005-05-24 10:12:12', '星期一') -> 2005-05-30 10:12:12
oracle.next_day(帶時區的時間戳,整數) - 與上面相同。第二個參數應該是 1..7 並解釋為 Sunday..Saturday。
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_ Between(timestamp with time zone, timestamp with time zone) - 傳回時間戳記 1 與時間戳記 2 之間的月數。如果計算小數月份,則 Months_ Between 函數將根據 31 天的月份計算小數。
oracle.months_ Between(oracle.date '1995-02-02 10:00:00', oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
oracle.to_date(text,text) - 傳回沒有時區的時間戳記。
oracle.to_date('02/16/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 2009-02-16 04:12:12
oracle.to_date(text) - 返回 oracle.date
oracle.to_date('02/16/09 04:12:12') -> 2009-02-16 04:12:12
oracle.sysdate() - 傳回伺服器時區的語句時間戳記 (orafce.timezone)
oracle.sysdate() -> 2015-12-09 17:47:56
oracle.dbtimezone - 返回伺服器時區 - 透過 orafce.timezone 模擬
oracle.dbtimezone() -> GMT
oracle.sessiontimezone() - 傳回會話時區 - 目前 PostgreSQL 時區
oracle.sessiontimezone() -> 歐洲/布拉格
oracle.sys_extract_utc(timestamp with timezone) - 傳回 utc 時區的時間戳
oracle.sys_extract_utc(當前時間戳記)
oracle.sys_extract_utc(oracle.date) - 傳回 utc 時區的時間戳,當未指定時區時,使用會話(目前 PostgreSQL)時區
oracle.sys_extract_utc(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-24 09:21:12
oracle.to_char(timestamp) - 傳回 nls_date_format 格式的時間戳記。
orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 21 年 5 月 14 日 12:13:44
oracle.+(oracle.date,smallint) - 傳回 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) - 回傳 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::整數 -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) - 回傳 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,numeric) - 回傳 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::numeric -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) - 傳回 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) - 傳回 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::整數 -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) - 回傳 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,numeric) - 回傳 oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::numeric -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) - 回傳雙精度
oracle.to_date('2014-07-17 11:10:15', 'yyyy-mm-dd hh24:mi:ss') - oracle.to_date('2014-02-01 10:00:00', 'yyyy -mm-dd hh24:mi:ss') -> 166.048785
您需要將 search_path 設為 oracle,"$user", public, pg_catalog 因為像 oracle.add_months,oracle.last_day,oracle.next_day,oracle.months_ Between 這樣的函數與 pg_catalog.add_months,pg_catalog.last_day 這樣的函數與 pg_catalog.add_months,pg_catalog.last_day 並排。 next_day,pg_catalog.months_ Between。
PostgreSQL不需要Oracle的表'dual',但由於它被Oracle用戶密集使用,因此已在orafce中添加了它。該表位於oracle
模式中。通常您希望允許非限定存取 - 因此您應該將此模式新增至search_path
配置(例如postgresql.conf
中的search_path = 'oracle, pg_catalog, "$user", public'
)。
PostgreSQL 透過 RAISE NOTICE 向客戶端發送訊息。 Oracle 使用 dbms_output.put_line()。這與“RAISE NOTICE”的工作方式不同。 Oracle 有一個會話佇列,put_line() 將一行加入到佇列中,函數 get_line() 從佇列中讀取。如果設定了「serveroutput」標誌,則用戶端將透過所有 sql 語句讀取佇列。您可以使用:
選擇 dbms_output.enable(); 選擇 dbms_output.put_line('first_line'); 選擇 dbms_output.put_line('next_line'); 從dbms_output.get_lines(0)中選擇*;
或者
選擇 dbms_output.enable(); 選擇 dbms_output.serveroutput('t'); 選擇 dbms_output.put_line('first_line');
套件包含以下函數:enable()、disable()、serveroutput()、put()、put_line()、new_line()、get_line()、get_lines()。包隊列在會話的本機記憶體中實作。
該套件允許 PL/pgSQL 程式讀取和寫入可從伺服器存取的任何檔案。每個會話最多可以開啟 10 個文件,最大行大小為 32K。該軟體包包含以下功能:
utl_file.fclose(file utl_file.file_type) - 關閉文件
utl_file.fclose_all() - 關閉所有文件
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) - 複製文字文件
utl_file.fflush(file utl_file.file_type) - 刷新緩衝區中的所有數據
utl_file.fgetattr(location, filename) - 取得檔案屬性
utl_file.fopen(位置文字, 檔案名稱文字, file_mode 文字 [, maxlinesize int] [, 編碼名稱]) utl_file.file_type - 開啟文件
utl_file.fremove(location, filename) - 刪除文件
utl_file.frename(location, filename, dest_dir, dest_file[, overwrite]) - 重新命名文件
utl_file.get_line(file utl_file.file_type) text - 從檔案讀取一行
utl_file.get_nextline(file utl_file.file_type) text - 從檔案讀取一行或傳回 NULL
utl_file.is_open(file utl_file.file_type) bool - 如果檔案已打開,則傳回 true
utl_file.new_line(file utl_file.file_type [,rows int]) - 將一些新行字元放入文件
utl_file.put(file utl_file.file_type, buffer text) - 將緩衝區放入文件
utl_file.put_line(file utl_file.file_type, buffer text) - 將行放入文件
utl_file.putf(file utl_file.file_type, format buffer [,arg1 text][,arg2 text][..][,arg5 text]) - 將格式化文字放入檔案中
utl_file.tmpdir() - 取得暫存目錄的路徑
由於 PostgreSQL 不支援按引用調用,因此某些函數略有不同:fclose 和 get_line。
宣告 f utl_file.file_type; 開始 f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<閱讀>> 環形 開始 引發通知 '%', utl_file.get_line(f); 例外 當 no_data_found 那麼 退出讀取; 結尾; 結束循環; f := fclose(f); 結尾;
或第二個(使用 PostgreSQL 特定函數 get_nextline)
宣告 f utl_file.file_type; 行文本; 開始 f := utl_file.fopen('/tmp', 'sample.txt', 'r'); 環形 行 := utl_file.get_nextline(f); 當行為 NULL 時退出; 提出通知'%',行; 例外 當其他人那麼 utl_file.fclose_all(); 結尾;
在使用該套件之前,您必須設定 utl_file.utl_file_dir 表。它包含所有允許的目錄,沒有結束符號(“/”或“”)。在 WinNT 平台上,路徑每次都必須以符號 '' 結尾。
目錄條目可以命名(表utl_file.utl_file_dir
中的第二列)。 location
參數可以是目錄名稱或字典路徑。該位置首先被解釋為目錄名稱並進行檢查。如果未找到(在第二列中),則該位置將被解釋並檢查為路徑。
utl_file 套件(Postgres 上的架構)中的函數需要存取表格 utl_file.utl_file_dir。這一事實可用於控制哪些使用者可以使用這些功能或不能使用這些功能。對於 PUBLIC,預設為 READ。 INSERT、UPDATE只有特權使用者(超級使用者)才能做到。因此,非特權使用者可以使用此套件中的函數,但無法變更安全目錄清單(utl_file.utl_file_dir 表的內容)。該表的內容對於 PUBLIC 是可見的(或者對於使用此套件中的函數的使用者應該是可見的)。
這是 Oracle 的 DBMS_SQL 包 API 的實現
它不能確保完全相容性,但應該減少成功遷移所需的工作。
注意:PostgreSQL 架構與 Oracle 架構不同。 PL/pgSQL 與 SQL 引擎一樣在相同的上下文中執行。那麼就沒有任何理由在 Postgres 中使用 Oracle 的模式(例如大量收集和迭代收集)來獲得良好的效能。這段程式碼旨在減少與將某些應用程式從 Oracle 移植到 Postgres 相關的工作,並且可以很好地工作。但相對於內建 PL/pgSQL 語句,不會有任何效能優勢。 Oracle API 的模擬會產生記憶體和 CPU 開銷,這對於較大的資料而言可能非常重要。
此擴充實作了 Oracle dbms_sql 介面的子集。此擴充的目標不是與 Oracle 相容,它旨在減少一些與將 Oracle 的應用程式遷移到 Postgres 相關的工作。支援一些基本的批次 DML 功能:
做$$ 宣告 c 整數; 一個 int[]; b varchar[]; ca 數字[]; 開始 c := dbms_sql.open_cursor(); 呼叫 dbms_sql.parse(c, '插入 foo 值(:a, :b, :c)'); a := 陣列[1, 2, 3, 4, 5]; b := ARRAY['Ahoj', '納茲達爾', '巴扎爾']; ca := 陣列[3.14, 2.22, 3.8, 4]; 呼叫 dbms_sql.bind_array(c, 'a', a, 2, 3); 呼叫 dbms_sql.bind_array(c, 'b', b, 3, 4); 呼叫 dbms_sql.bind_array(c, 'c', ca); 引發通知“插入行 %d”,dbms_sql.execute(c); 結尾; $$; 做$$ 宣告 c 整數; 一個 int[]; b varchar[]; ca 數字[]; 開始 c := dbms_sql.open_cursor(); 呼叫 dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 fromgenerate_series(1, 35) g(i)'); 呼叫 dbms_sql.define_array(c, 1, a, 10, 1); 呼叫 dbms_sql.define_array(c, 2, b, 10, 1); 呼叫 dbms_sql.define_array(c, 3, ca, 10, 1); 執行 dbms_sql.execute(c); 而 dbms_sql.fetch_rows(c) > 0 環形 呼叫 dbms_sql.column_value(c, 1, a); 呼叫 dbms_sql.column_value(c, 2, b); 呼叫 dbms_sql.column_value(c, 3, ca); 引發通知 'a = %', a; 發出通知 'b = %', b; 發出通知 'c = %', ca; 結束循環; 呼叫 dbms_sql.close_cursor(c); 結尾; $$;
有函數dbms_sql.describe_columns_f
,類似過程dbms_sql.describe_columns
。請注意,類型 ID 與 PostgreSQL 類型系統相關。這些值不會轉換為 Oracle 的數字
做$$ 宣告 c 整數; r 記錄; d dbms_sql.desc_rec; 開始 c := dbms_sql.open_cursor(); 呼叫 dbms_sql.parse(c, 'select * from pg_class'); r := dbms_sql.describe_columns(c); 引發通知 '%', r.col_cnt; foreach d 陣列 r.desc_t 環形 引發通知 '% %', d.col_name, d.col_type::regtype; 結束循環; 呼叫 dbms_sql.close_cursor(c); 結尾; $$; 做$$ 宣告 c 整數; n 整數; d dbms_sql.desc_rec; da dbms_sql.desc_rec[]; 開始 c := dbms_sql.open_cursor(); 呼叫 dbms_sql.parse(c, 'select * from pg_class'); 呼叫 dbms_sql.describe_columns(c, n, da); 提出通知 '%', n; foreach d 陣列 da 環形 引發通知 '% %', d.col_name, d.col_type::regtype; 結束循環; 呼叫 dbms_sql.close_cursor(c); 結尾; $$;
該套件是 dbms_pipe Oracle 套件的模擬。它提供會話間通信。您可以發送和閱讀任何訊息,無論等待或不等待;列出活動管道;將管道設定為私有或公用;並且,使用顯式或隱式管道。
管道的最大數量為 50。
共享記憶體用於發送訊息。
範例如下:
-- 會議A 選擇 dbms_pipe.create_pipe('my_pipe',10,true); -- 明確管道創建 選擇 dbms_pipe.pack_message('neco je jinak'); select dbms_pipe.pack_message('還有別的'); 選擇 dbms_pipe.send_message('my_pipe',20,0); -- 更改限制並發送,無需等待 從dbms_pipe.db_pipes中選擇*; -- 目前管道列表 -- 會議B 選擇 dbms_pipe.receive_message('my_pipe',1); -- 等待訊息最多 1 秒 選擇 dbms_pipe.next_item_type(); -- -> 11、文字 選擇 dbms_pipe.unpack_message_text(); 選擇 dbms_pipe.next_item_type(); -- -> 11、文字 選擇 dbms_pipe.unpack_message_text(); 選擇 dbms_pipe.next_item_type(); -- -> 0,沒有更多項目 選擇 dbms_pipe.remove_pipe('my_pipe');
但與 Oracle 相比,存在一些差異:
管道的限制不是以位元組為單位,而是以管道中的元素為單位
您可以發送訊息,無需等待
你可以發送空訊息
next_item_type 知道 TIMESTAMP(類型 13)
PostgreSQL 不知道 RAW 類型,請使用 bytea 來代替
進程間通訊的另一種方式。
-- 會議A 選擇 dbms_alert.register('boo'); 從dbms_alert.waitany(10)中選擇*; -- 會議B 選擇 dbms_alert.register('boo'); 從dbms_alert.waitany(10)中選擇*; ——C 場 select dbms_alert.signal('boo','美好的一天');
此模組包含一些用於處理 PLVdate 包中的工作日的函數。詳細文件可以在 PLVision 庫中找到。該套件是多文化的,但預設配置僅適用於歐洲國家(請參閱原始程式碼)。
您應該定義自己的非工作日(最多 50 天)和自己的假期(最多 30 天)。假期是任何非工作日,每年都是一樣的。例如西方國家的聖誕節。
plvdate.add_bizdays(day date, days int) date - 取得透過新增 <n> 個工作天建立在日期的日期
plvdate.nearest_bizday(day date) date - 取得使用者定義的給定日期最近的營業日期
plvdate.next_bizday(day date) date - 取得使用者定義的給定日期的下一個營業日期
plvdate.bizdays_ Between(day1 date, day2 date) int - 取得兩個日期之間的工作天數
plvdate.prev_bizday(day date) date - 取得給定日期的上一個營業日期
plvdate_isbizday(date) bool - 呼叫此函數以決定日期是否為工作日
plvdate.set_nonbizday(dow varchar) - 將一週中的某一天設定為非營業日
plvdate.unset_nonbizday(dow varchar) - 取消將星期幾設定為非營業日
plvdate.set_nonbizday(day date) - 將日期設為非營業日
plvdate.unset_nonbizday(day date) - 取消將日期設為非營業日
plvdate.set_nonbizday(day date, Repeat bool) - 將日期設為非營業日,如果「repeat」為 true,則每年的日期為非營業日
plvdate.unset_nonbizday(day date, Repeat bool) - 取消將日期設為非營業日,如果「repeat」為 true,則每年的日期為非營業日
plvdate.use_easter() - 復活節週日和復活節週一將放假
plvdate.unuse_easter();
plvdate.use_easter(useit 布林值);
plvdate.using_easter() bool - 如果我們使用復活節則傳回 true
plvdate.use_great_friday() - 復活節大星期五將放假
plvdate.unuse_easter();
plvdate.use_easter(useit 布林值);
plvdate.using_easter() bool - 如果我們使用復活節大星期五作為假期,則返回 true
plvdate.include_start() - 在 bizdays_ Between 計算中包含開始日期
plvdate.noinclude_start();
plvdate.include_start(包括布林值);
plvdate.include_start() 布林;
plvdate.default_holidays(varchar) - 載入預設配置。目前您可以使用以下配置:捷克、德國、奧地利、波蘭、斯洛伐克、俄羅斯、英國和美國。
配置僅包含所有地區的公共假期。您可以使用 plvdate.set_nonbizday(nonbizday, true) 新增自己的地區假日
例子:
postgres=# 選擇 plvdate.default_holidays('捷克'); 預設假期 ----------------- (1 行) postgres=# 選擇 to_char(current_date, 'day'), plvdate.next_bizday(目前日期), to_char(plvdate.next_bizday(current_date),'日'); 到_char | next_bizday | 到_char ----------+-------------+------------ 星期六 | 2006-03-13 |週一 (1 行)
非歐洲環境的變化:
選擇 plvdate.unset_nonbizday('星期六'); 選擇 plvdate.unset_nonbizday('星期日'); 選擇 plvdate.set_nonbizday('星期五'); 選擇 plvdate.set_nonbizday('2006-05-19', true); 選擇 plvdate.unuse_easter();
該包包含一些有用的字串和字元函數。每個函數都支援正偏移量和負偏移量,即與字串末尾的偏移量。例如:
plvstr.left('abcdef',2) -> ab plvstr.left('abcdef',-2) -> abcd plvstr.substr('abcdef',1,1) -> a plvstr.substr('abcdef',-1,1) -> f plvstr.substr('abcde',-2,1) -> d
函數列表:
plvstr.normalize(str text) - 規範化字串 - 用空格替換白色字符,用空格替換空格
plvstr.is_prefix(str text, prefix text, cs bool) - 如果 prefix 是 str 的前綴,則傳回 true
plvstr.is_prefix(str text, prefix text) - 如果 prefix 是 str 的前綴,則傳回 true
plvstr.is_prefix(str int, prefix int) - 如果 prefix 是 str 的前綴,則傳回 true
plvstr.is_prefix(str bigint, prefix bigint) - 如果 prefix 是 str 的前綴,則傳回 true
plvstr.substr(str text, start int, len int) - 傳回從 start_in 開始到 end 的子字串
plvstr.substr(str text, start int) - 傳回從 start_in 開始到結束的子字串
plvstr.instr(str text, patt text, start int, nth int) - 在字串中搜尋模式
plvstr.instr(str text, patt text, start int) - 在字串中搜尋模式
plvstr.instr(str text, patt text) - 在字串中搜尋模式
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) - 呼叫此函數傳回字串的左側部分
plvstr.lpart(str text, div text, start int, nth int) - 呼叫此函數傳回字串的左側部分
plvstr.lpart(str text, div text, start int) - 呼叫此函數傳回字串的左側部分
plvstr.lpart(str text, div text) - 呼叫此函數傳回字串的左側部分
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) - 呼叫此函數傳回字串的右側部分
plvstr.rpart(str text, div text, start int, nth int) - 呼叫此函數傳回字串的右側部分
plvstr.rpart(str text, div text, start int) - 呼叫此函數傳回字串的右側部分
plvstr.rpart(str text, div text) - 呼叫此函數傳回字串的右側部分
plvstr.lstrip(str text, substr text, num int) - 呼叫此函數從開頭刪除字符
plvstr.lstrip(str text, substr text) - 呼叫此函數從開頭刪除字元
plvstr.rstrip(str text, substr text, num int) - 呼叫此函數從末尾刪除字符
plvstr.rstrip(str text, substr text) - 呼叫此函數從末尾刪除字符
plvstr.rvrs(str text, start int, _end int) - 反轉字串或字串的一部分
plvstr.rvrs(str text, start int) - 反轉字串或字串的一部分
plvstr.rvrs(str text) - 反轉字串或字串的一部分
plvstr.left(str text, n int) - 傳回前 num_in 個字元。您可以使用負數 num_in
plvstr.right(str text, n int) - 傳回最後 num_in 個字元。您可以使用負數 num_ni
plvstr.swap(str text, Replace text, start int, length int) - 將字串中的子字串替換為指定字串
plvstr.swap(str text, Replace text) - 將字串中的子字串替換為指定字串
plvstr.betwn(str text, start int, _end int, Included bool) - 尋找開始位置與結束位置之間的子字串
plvstr.betwn(str text, start text, _end text, startnth int, endnth int, Included bool, gotoend bool) - 尋找開始位置和結束位置之間的子字串
plvstr.betwn(str text, start text, _end text) - 尋找開始位置和結束位置之間的子字串
plvstr.betwn(str text, start text, _end text, startnth int, endnth int) - 找出開始位置和結束位置之間的子字串
plvchr.nth(str text, n int) - 呼叫此函數傳回字串中的第 N 個字符
plvchr.first(str text) - 呼叫此函數傳回字串中的第一個字符
plvchr.last(str text) - 呼叫此函數傳回字串中的最後一個字符
plvchr.is_blank(c int) - 為空
plvchr.is_blank(c text) - 為空白
plvchr.is_digit(c int) - 是數字
plvchr.is_digit(c text) - 是數字
plvchr.is_quote(c int) - 是報價
plvchr.is_quote(c text) - 是引用
plvchr.is_other(c int) - 是其他
plvchr.is_other(c text) - 是其他
plvchr.is_letter(c int) - 是字母
plvchr.is_letter(c text) - 是字母
plvchr.char_name(c text) - 將字元名稱作為 VARCHAR 傳回為 ascii 代碼。
plvchr.quoted1(str text) - ''' 之間的引用文本
plvchr.quoted2(str text) - '"' 之間的引用文本
plvchr.stripped(str text, char_in text) - 刪除指定字元的所有實例的字串
PLVsubst 套件根據替換關鍵字執行字串替換。
plvsubst.string(template_in text, vals_in text[]) - 掃描字串中替換關鍵字的所有實例,並將其替換為替換值清單中的下一個值
plvsubst.string(template_in text, vals_in text[], subst_in text)
plvsubst.string(文本中的模板,文本中的vals_文本,文本中的delim_)
plvsubst.string(template_in文本,vals_in文本,delim_in文本,subst_in文本)
plvsubst.setsubst(str text) - 將替換關鍵字設為預設“%s”
plvsubst.subst() - 檢索替換關鍵字
範例:
select plvsubst.string('我的名字是 %s %s。', ARRAY['Pavel','Stěhule']); 細繩 -------------------------- 我的名字是帕維爾·斯特胡勒。 (1 行) select plvsubst.string('我的名字是 %s %s。', 'Pavel,Stěhule'); 細繩 -------------------------- 我的名字是帕維爾·斯特胡勒。 (1 行) select plvsubst.string('我的名字是 $$ $$.', 'Pavel|Stěhule','|','$$'); 細繩 -------------------------- 我的名字是帕維爾·斯特胡勒。 (1 行)
dms_utility.format_call_stack() — 傳回包含呼叫堆疊內容的格式化字串
postgres=# 選擇 foo2(); 富2 --------------------------------- ----- 呼叫堆疊----- 線對象 數字語句名稱 1 返回函數foo 1 返回函數foo1 1 返回函數foo2 (1 行)
該軟體包與原始 PLVlex 不相容。
postgres=# 從其中選擇 * plvlex.tokens('select * from abc join d ON x=y', true, true); 郵政 |代幣|代碼| 類 |分隔符號|模組 ----+--------+------+--------+------------+------- - 0 |選擇 | 527 | 527關鍵字 | | 7 | * | 42 | 42其他 | |自己 9 |來自 | 377 | 377關鍵字 | | 25 | 25 ABC | |識別| | 20 |加入 | 418 | 418關鍵字 | | 25 | 25 d | |識別| | 27 | 27上 | 473 | 473關鍵字 | | 30| x| |識別| | 31 | = | 61 | 61其他 | |自己 32 | 32 y | |識別| | (10 行)
警告:關鍵字的程式碼可以在 PostgreSQL 版本之間更改! o plvlex.tokens(str text,skip_spaces bool,qualified_names bool) - 傳回 str 中的詞彙元素表。
此套件可保護使用者輸入免於 SQL 注入。
dbms_assert.enquote_literal(varchar) varchar - 新增前導和尾隨引號,驗證所有單引號是否與相鄰單引號配對。
dbms_assert.enquote_name(varchar [, boolean]) varchar - 將名稱用雙引號引起來。可選的第二個參數確保名稱的小寫。注意 - 在 Oracle 上第二個參數大寫!
dbms_assert.noop(varchar) varchar - 傳回值而不進行任何檢查。
dbms_assert.qualified_sql_name(varchar) varchar - 此函數會驗證輸入字串是否為限定的 SQL 名稱。
dbms_assert.schema_name(varchar) varchar - 函數驗證輸入字串是否為現有架構名稱。
dbms_assert.simple_sql_name(varchar) varchar - 此函數會驗證輸入字串是否為簡單 SQL 名稱。
dbms_assert.object_name(varchar) varchar - 驗證輸入字串是否是現有 SQL 物件的限定 SQL 識別碼。
該單元包含一些斷言函數。
plunit.assert_true(bool [, varchar]) - 斷言條件為 true。
plunit.assert_false(bool [, varchar]) - 斷言條件為假。
plunit.assert_null(anyelement [, varchar]) - 斷言實際值為 null。
plunit.assert_not_null(anyelement [, varchar]) - 斷言實際值不為空。
plunit.assert_equals(anyelement, anyelement [, double precision] [, varchar]) - 斷言預期和實際相等。
plunit.assert_not_equals(anyelement, anyelement [, double precision] [, varchar]) - 斷言預期和實際相等。
plunit.fail([varchar]) - Fail 可用於使用提供的訊息導致測試過程立即失敗。
dbms_random.initialize(int) - 使用種子值初始化套件。
dbms_random.normal() - 傳回標準常態分佈的隨機數。
dbms_random.random() - 從 -2^31 .. 2^31 傳回隨機數。
dbms_random.seed(int)
dbms_random.seed(text) - 重置種子值。
dbms_random.string(opt text(1), len int) - 建立隨機字串
dbms_random.terminate() - 終止套件(在 Pg 中不執行任何操作)
dbms_random.value() - 傳回 [0.0 - 1.0) 之間的隨機數
dbms_random.value(low double precision, high double precision) - 從 [low - high) 回傳一個隨機數
此模組包含以下函數的實作:concat、nvl、nvl2、lnnvl、decode、maximum、least、bitand、nanvl、sinh、cosh、tanh、oracle.substr 和 oracle.mod。
oracle.substr(str text, start int, len int) - Oracle 相容子字串
oracle.substr(str text, start int) - Oracle 相容子字串
oracle.substr(str numeric, start numeric) - Oracle 相容子字串
oracle.substr(str numeric, start numeric, len numeric) - Oracle 相容子字串
oracle.substr(str varchar, start numeric) - Oracle 相容子字串
oracle.substr(str varchar, start numeric,len numeric) - Oracle 相容子字串
oracle.lpad(string, length [, fill]) - Oracle 相容 lpad
oracle.rpad(string, length [, fill]) - Oracle 相容的 rpad
oracle.ltrim(字串文字[,字元文字]) - Oracle 相容的 ltrim
oracle.rtrim(字串文字[,字元文字]) - Oracle相容的rtrim
oracle.btrim(字串文字[,字元文字]) - Oracle相容btrim
oracle.length(string char) - Oracle 相容長度
oracle.listagg(str text [,分隔符號文字]) - 要列出的聚合值
oracle.wm_concat(str text) - 將值聚合到逗號分隔列表
oracle.median(float4) - 計算中位數
oracle.median(float8) - 計算中位數
oracle.to_number(text) - 將字串轉換為數字
oracle.to_number(numeric) - 將字串轉換為數字
oracle.to_number(numeric,numeric) - 將字串轉換為數字
public.to_multi_byte(text) - 將所有單字節字元轉換為其對應的多位元組字符
public.to_single_byte(text) - 將所有多位元組字元轉換為其對應的單字節字符
oracle.greatest(anyelement, anyelement[]) - Oracle 相容性最大,在 NULL 輸入時傳回 NULL
oracle.least(anyelement, anyelement[]) - Oracle 相容性最低,在 NULL 輸入時傳回 NULL
oracle.mod(int, int) - Oracle 相容性 mod,如果第二個參數為零,則傳回第一個參數
oracle.remainder(int, int) - 傳回數字除以另一個數字的餘數
oracle.remainder(numeric, numeric) - 傳回數字除以另一個數字的餘數
oracle.sys_guid() - 傳回 bytea - 16 位元組的全域 uniq id
您可能需要將search_path 設定為'oracle, pg_catalog, "$user", public' 因為oracle.substr, oracle.lpad, oracle.rpad, oracle.ltrim, oracle.rtrim, oracle.btrim, oracle.length 已安裝在一邊分別與 pg_catalog.substr、pg_catalog.lpad、pg_catalog.rpad、pg_catalog.ltrim、pg_catalog.rtrim、pg_catalog.btrim、pg_catalog.length 並排。
函數 oracle.decode、oracle.greatest 和 oracle.least 必須始終以模式名稱為前綴,即使 oracle 位於 search_path 中的 pg_catalog 之前,因為這些函數是在 PostgreSQL 解析器和分析器內部實現的。如果沒有模式名稱,將始終使用內部函數。
請注意,對於 lpad 和 rpad,參數 string 和 fill 可以是 CHAR、VARCHAR、TEXT、VARCHAR2 或 NVARCHAR2 類型(請注意,最後兩個是 orafce 提供的類型)。預設填充字元是半角空格。對於 ltrim、rtrim 和 btrim 也類似。
請注意,oracle.length 有一個限制,它只能以字元為單位工作,因為 PostgreSQL CHAR 類型僅支援字元語意。
具有三個參數的 oracle.substr 可以傳回不同的結果(null 或空字串),取決於設定 orafce.using_substring_zero_width_in_substr 變數(oracle、warning_oracle、orafce、warning_orafce)。只有當第三個參數 (substring_length) 為零時,才會傳回此不同的結果。預設是 warning_oracle,這表示引發警告並傳回 null。
此函數傳回全域唯一 ID。它從“uuid-ossp”擴充功能中呼叫指定的函數,然後應該在使用sys_guid函數之前安裝函數。預設情況下,函數使用函數 uuid_generate_v1,但也可以使用函數 uuid_generate_v1mc、uuid_generate_v4(透過設定 orafce.sys_guid_source)。 oracle.sys_guid 也可以使用內建 gen_random_uuid 函數。在這種情況下,不需要擴展名“uuid-ossp”。
orafce 的 VARCHAR2 實作了 VARCHAR2 的 Oracle 資料庫規格的部分內容:
類型修飾符的單位 = '位元組'(有關字元語義,請參閱 NVARCHAR2)
與 PostgreSQL varchar 不同,隱式轉換為 VARCHAR2 不會截斷超過宣告的最大長度的空格
對於這些類型可以使用 null safe ||運算符,當您啟用 orafce.varchar2_null_safe_concat TO true 時。行為與 Oracle 非常相似。
注意: - 當結果為空字串時,結果為 NULL。這種行為是 預設禁用。
注意: - 3.7 和舊版 Orafce 之間可能存在不相容性 發布。運算符函數現在被標記為穩定(之前是不可變的)。 不可能在穩定或易失性表達式上建立函數索引。
-- null 安全連線(預設為停用) 選擇空|| '你好'::varchar2 ||無效的; 將 orafce.varchar2_null_safe_concat 設為 true; 選擇空 || '你好'::varchar2 ||無效的;
請注意,PostgreSQL 不允許動態指定我們如何解釋 varchar 字串。它始終將它們解釋為由資料庫編碼確定的“字元”字串。因此,我們無法在相同資料庫中同時支援給定 varchar 類型的 BYTE 和 CHARACTER 語意。我們選擇實作 BYTE 語義,因為這是 Oracle 中的預設語意。對於 CHARACTER 語意,請參閱 NVARCHAR2,它預設總是實作 CHARACTER 語意。
使用上述類型儲存由多位元組編碼字元組成的字串時請小心,其中每個字元可以由任意數量的位元組組成。
NVARCHAR2 實作以下功能:
類型修飾符的單位='字元'(使用資料庫的字元集/編碼)
如果首選字元語義,請使用此類型。
請注意,與 Oracle 不同,orafce 的 VARCHAR2 和 NVARCHAR2 不會對「宣告」大小施加 4000 位元組的限制。事實上它與 PostgreSQL varchar 相同,約為 10MB(儘管 varchar 理論上可以儲存大小高達 1GB 的值)
一些與 VARCHAR2 字串一起使用的基於位元組的字串函數
substrb(VARCHAR2, int [, int]) - 從給定位元組位置(從一開始計數)開始提取指定長度(以位元組為單位)的子字串;如果未指定第三個參數,則考慮字串末尾的長度
strposb(VARCHAR2, VARCHAR2) - 傳回給定字串中指定子字串的位置(從一開始計數)
lengthb(VARCHAR2) - 傳回給定字串的長度(以位元組為單位)
Oracle 不區分 NULL 和空字串(當值用作文字時)。對於 Postgres NULL 和空字串是不同的值。為了簡單起見,最好確保(在 Postgres 資料庫中)僅使用 NULL(並且不使用空字串)或僅對文字類型列使用空字串(並且不使用 NULL)。兩種變體都有一些優點和缺點。
這可以透過觸發函數來確保:
oracle.replace_empty_strings([ 'on' | 'true' | '警告' | 'error' ]) oracle.replace_null_strings([ 'on' | 'true' | '警告' | 'error' ])
可選字串參數用作指示符,因此當這些函數內的行發生變更時,這些函數應該發出警告(可能是錯誤)。
建立表格測試(id 序號,名稱 varchar,姓氏 varchar); 建立觸發器 test_trg 插入或更新之前 通電測試 對於每一行 執行過程 oracle.replace_empty_strings(); INSERT INTO test(姓名) VALUES('', 'Stehule'); -- 名稱將會被 NULL 取代
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
更好的文檔
dbms_pipe 中更好的序列化(透過 _send 和 _recv 函數)
透過臨時表更改共享記憶體結構:只有鎖位於 shmem(點陣圖)中,資料位於 tmp tbl 中
該模組是在 BSD 許可下發布的。
此計畫由 Pavel Stehule <[email protected]> 於 2008 年創立。
其他貢獻者:
加布里埃萊·巴托里尼 (gbartolini)
傑弗瑞‧科恩 (jcohen)
賈爾斯·達羅德 (darold)
帕萬‧德奧拉西 (pavanvd)
艾森特勞特 (petere)
比娜‧愛默生 (b-emerson)
板垣貴宏 (板垣)
茲德內克‧科塔拉 (hlipa)
阿米特·蘭格特(阿米特蘭)
海基‧林納坎加斯 (hlinnaka)
藤井正夫
馬可‧南西亞里尼 (mnencia)
維納亞克波卡萊
加文雪利 (游泳)
帕維爾‧斯特胡勒 (okbob)
拉希拉‧賽義德 (rahila)