Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用基于java的正则表达式查询Oracle_Java_Regex_Stored Procedures_Plsql_Oracle11g - Fatal编程技术网

使用基于java的正则表达式查询Oracle

使用基于java的正则表达式查询Oracle,java,regex,stored-procedures,plsql,oracle11g,Java,Regex,Stored Procedures,Plsql,Oracle11g,我必须编写一个查询,将一个基于java的正则表达式(我相信是POSIX标准)发送到存储过程。它将使用此正则表达式字符串查询数据库,以仅获取通过正则表达式统计的记录 我在读关于oracle正则表达式的文章,我发现oracle正则表达式与Java不一样 对于10g版,Oracle数据库提供了4个您可以使用的regexp函数 可以在SQL和PL/SQL语句中使用。这些函数实现 POSIX扩展正则表达式(ERE)标准。神谕 支持排序序列和括号中的等价类 表达。NLS_排序设置确定使用的POSIX语言环境

我必须编写一个查询,将一个基于java的正则表达式(我相信是POSIX标准)发送到存储过程。它将使用此正则表达式字符串查询数据库,以仅获取通过正则表达式统计的记录

我在读关于oracle正则表达式的文章,我发现oracle正则表达式与Java不一样

对于10g版,Oracle数据库提供了4个您可以使用的regexp函数 可以在SQL和PL/SQL语句中使用。这些函数实现 POSIX扩展正则表达式(ERE)标准。神谕 支持排序序列和括号中的等价类 表达。NLS_排序设置确定使用的POSIX语言环境, 它决定了可用的排序序列和等价性 上课

然而,Oracle并没有完全实现POSIX ERE标准。信息技术 在三个方面存在偏差。首先,Oracle支持反向引用\1 通过正则表达式中的\9。POSIX ERE标准不适用 支持这些,即使POSIX BRE支持。以完全顺从的方式 引擎\1到\9将是非法的。POSIX标准对此进行了说明 转义不是具有 反斜杠。Oracle允许这样做,只是忽略了反斜杠。例如。 \z与Oracle中的z相同。结果是所有POSIX都是 正则表达式可以与Oracle一起使用,但有些正则表达式 在Oracle中工作的表达式可能会导致完全错误 兼容POSIX的引擎。显然,如果您只与Oracle合作,这些 差异是无关紧要的

第三个区别更加微妙。它不会导致任何错误,但是 可能导致不同的匹配。正如我在主题中解释的 POSIX标准,它要求正则表达式引擎返回最长的 如有变动,则进行匹配。甲骨文的引擎不能做到这一点。它是 一个传统的NFA引擎,就像所有讨论的非POSIX正则表达式一样 在这个网站上

如果您在其他编程中使用过正则表达式 语言,请注意POSIX不支持不可打印 字符转义类似于\t转义制表符或\n转义换行符。你可以用 这些都是用C++语言编写的POSIX引擎,因为 C++编译器将解释字符串常量中的\\和\n。在里面 SQL语句,则需要在 字符串与正则表达式匹配,使其与制表符或行匹配 打破Oracle的正则表达式引擎将字符串“\t”解释为 作为regexp参数传递时的regex t

只是想知道是否有一些帮助,我可以用来解决这个问题?还是必须将Java正则表达式转换为PLSQL正则表达式

我们将要使用的正则表达式将在Java中广泛使用。很少有将相同的正则表达式应用于oracle存储过程的用例。其中一个示例regex
.*.*.\u'^ ABC


我相信,如果我能知道这两个版本中的不兼容之处,那将更有帮助:)

首先,收集所有使用/预期的正则表达式,并在示例/测试表上运行一些查询,查看是否有任何regexp在Java中工作,但在Oracle中不工作。也许不会有任何问题,因为Oracle文档说它支持用于regexp的POSIX和Unicode标准,并且增强了它们


<>如果您发现在Oracle中不工作的ReXEPS,那么您可以考虑用PL/SQL包装器开发java存储过程,并在查询中使用。那么肯定不会有问题。

首先,收集所有使用/预期的正则表达式,并在示例/测试表上运行一些查询,以查看是否有任何正则表达式在Java中工作,但在Oracle中不工作。也许不会有任何问题,因为Oracle文档说它支持用于regexp的POSIX和Unicode标准,并且增强了它们


<>如果您发现在Oracle中不工作的ReXEPS,那么您可以考虑用PL/SQL包装器开发java存储过程,并在查询中使用。那么肯定不会有问题。

正如您的报价所解释的,这取决于正则表达式-一些正则表达式在两种实现中都可以工作。你能给我们看看你的正则表达式吗?到目前为止,您尝试了什么?
是发送到存储过程
为什么要这样做?写一个正则表达式很简单。如果一个正则表达式是由PL/SQL存储过程执行的,那么它应该是一个Oracle正则表达式,不是吗?从Java的角度来看,正则表达式只是一个传递给Oracle的普通字符串。应该没有理由进行任何正则表达式转换。请参阅我的更新问题,正如您的报价所解释的,这取决于正则表达式-一些正则表达式在两种实现中都可以工作。你能给我们看看你的正则表达式吗?到目前为止,您尝试了什么?
是发送到存储过程
为什么要这样做?写一个正则表达式很简单。如果一个正则表达式是由PL/SQL存储过程执行的,那么它应该是一个Oracle正则表达式,不是吗?从Java的角度来看,正则表达式只是一个传递给Oracle的普通字符串。应该没有理由进行任何正则表达式转换。请查看我的更新问题正则表达式未知。。它可以是任何东西。在这种情况下,我首先假设不会有问题,然后开发一个简单的查询,在得到regexp时使用它们。我想,在PDLC中,您将有一个QA阶段;然后,您将发现是否存在Oracle以不同方式解释的任何棘手的regexp。同时,我会使用regexp,看看是否可以找到差异。另外,我会告诉项目经理或业务涉众获取/生成用例文档,因为没有适当的需求规范,开发人员无法正常工作……正则表达式是未知的。。它可以是任何东西。在这种情况下,我将从假设没有问题开始,并开发一个使用正则表达式的简单查询