模拟 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.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() - 返回字节 - 全局uniq ID的16个字节
您可能需要将search_path设置为'oracle,pg_catalog,“ $ user”,public',因为oracle.substr,oracle.lpad,oracle.rpad,oracle.ltrim,oracle.racle.rtrim,oracle.btrim,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之前是pg_catalog,因为这些函数是在PostgreSQL Parser和分析仪内实现的。没有模式名称,将始终使用内部功能。
请注意,在LPAD和RPAD的情况下,参数字符串和填充可以是类型的char,varchar,text,varchar2或nvarchar2(请注意,最后两个是Orafce提供的类型)。默认填充字符是半宽的空间。同样,对于LTRIM,RTRIM和BTRIM。
请注意,oracle.length具有仅以字符单位工作的限制,因为PostgreSQL Char类型仅支持字符语义。
带有三个参数的oracle.substr可以返回不同结果(null或空字符串)依赖项设置orafce.usis_substring_zero_width_in_in_in_substr actible(oracle,warning_oracle,orafce,orafce,arafce,warning_orafce)。仅当第三个参数(substring_length)为零时,才返回此不同的结果。默认值是警告_oracle,这意味着提高警告和返回空。
此功能返回全局唯一ID。它调用来自“ uuid-ossp”扩展名的指定函数,然后在使用函数sys_guid之前安装此功能。默认情况下,此函数使用函数uuid_generate_v1,但是函数uuid_generate_v1mc,uuid_generate_v4也可以使用(通过设置orafce.sys_guid_source)。 oracle.sys_guid也可以使用builin gen_random_uuid func。在这种情况下,不需要扩展名“ UUID-OSSP”。
ORAFCE的VARCHAR2实现了有关Varchar2的Oracle数据库规范的一部分:
类型修饰符='bytes'的单位(有关字符语义,请参见NVarchar2)
与postgresql varchar不同,对varchar2的隐性铸件不会超过最大长度的白色空间
因为这些类型可以使用Null Safe ||运算符,当您启用orafce.varchar2_null_safe_concat时。行为与甲骨文非常相似。
注意: - 当结果为空字符串时,结果为null。这种行为是 默认情况下禁用。
注意: - 3.7和较旧的Orafce之间可能不兼容 发布。现在,操作员函数被标记为稳定(以前是不变的)。 不可能通过稳定或挥发性表达式创建功能索引。
- Null Safe Concat(默认禁用) 选择null || 'Hello':: varchar2 ||无效的; set orafce.varchar2_null_safe_concat ture; 选择null || 'Hello':: varchar2 ||无效的;
请注意,PostgreSQL不允许动态指定我们如何解释Varchar字符串。它总是将它们解释为由数据库编码确定的“字符”字符串。因此,我们不能支持同一数据库中给定的VARCHAR类型的字节和字符语义。我们选择实现oracle中默认的字节语义。有关字符语义,请参阅NVARCHAR2,默认情况下总是实现字符语义。
当使用上述类型存储由多键编码字符组成的字符串时,请小心,其中每个字符都可以由任意数量的字节组成。
NVARCHAR2实施以下内容:
类型修饰符的单位='字符'(使用数据库的字符集/编码)
如果首选字符语义,请使用此类型。
请注意,与Oracle不同,Orafce的Varchar2和Nvarchar2不会对“声明”大小限制4000字节的限制。实际上,它与postgresql varchar的相同,该varchar的大约为10MB(尽管Varchar可以在理论上存储大小的值最高为1GB)
一些基于字节的字符串函数,可与varchar2字符串一起使用
substrb(varchar2,int [,int]) - 从给定的字节位置(从一个计数计数)开始提取指定长度(字节)的子字符串;如果未指定第三个参数,则考虑到字符串末端的长度
strposb(varchar2,varchar2) - 返回给定字符串中指定子字符串的位置(从一个计数)
LENGTHB(VARCHAR2) - 返回给定字符串的长度(以字节)
Oracle不会在空字符串和空字符串之间差异(当值用作文本时)。对于Postgres null和空字符串是不同的值。为简单起见,可以确保(在Postgres数据库中)仅使用nulls(并且不要使用空字符串)或仅使用空字符串(并且不要使用nulls)进行文本类型列。这两个变体都有一些优势和缺点。
这可以通过触发功能来实现:
oracle.replace_empty_strings(['on'on'|'true'|'警告'|'错误']) oracle.replace_null_strings(['on'on'|'true'|'警告'|'错误'])
可选的字符串参数用作指示器,因此当这些功能内部更改行时,这些功能应引起警告(可能是错误)。
创建表测试(ID序列号,名称VARCHAR,姓氏Varchar); 创建触发test_trg 插入或更新之前 测试 对于每一行 执行过程oracle.replace_empty_strings(); 插入测试(名称,姓氏)值('',''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函数)
通过临时表的Alter共享存储结构:仅锁在Shmem(位图),TMP TBL中的数据
该模块根据BSD许可发布。
该项目由Pavel Stehule <[email protected]>于2008年成立。
其他贡献者:
Gabriele Bartolini(Gbartolini)
杰弗里·科恩(Jeffrey Cohen)(JCOHEN)
吉尔斯·达罗德(Darold)
Pavan Deolasee(Pavanvd)
彼得·艾森特拉特(Peter Eisentraut)(佩特)
贝娜·艾默生(B-Emerson)
高海itagaki(伊塔加基)
ZDENEK KOTALA(HLIPA)
阿米特·兰戈特(Amitlan)
Heikki Linnakangas(Hlinnaka)
富士鞋
Marco Nenciarini(Mnencia)
Vinayak Pokale
加文雪利(SWM)
Pavel Stehule(Okbob)
拉希拉·赛义德(Rahila)(拉希拉)