Regex Oracle(pl sql)-如何将特定数据从文本提取到对象类型变量中?

Regex Oracle(pl sql)-如何将特定数据从文本提取到对象类型变量中?,regex,oracle,plsql,procedure,Regex,Oracle,Plsql,Procedure,我将文本作为varchar2变量提供,例如: EXER/ATP-45/-// MSGID/BIOCHEM3/-/-/-/-/-// GEODATUM/UTM// PAPAA/1KM/-//15KM/-// 因此,每一行分隔符都是//(但也可以有空格、新行等,它们应该被忽略)表示空白字段,应忽略。我还定义了新的对象类型,定义如下: TYPE t_promien IS RECORD( EXER VARCHAR2, MSGID VA

我将文本作为varchar2变量提供,例如:

EXER/ATP-45/-//
MSGID/BIOCHEM3/-/-/-/-/-//
GEODATUM/UTM//
PAPAA/1KM/-//15KM/-//
因此,每一行分隔符都是//(但也可以有空格、新行等,它们应该被忽略)表示空白字段,应忽略。我还定义了新的对象类型,定义如下:

TYPE t_promien      IS RECORD(
EXER                VARCHAR2,
MSGID               VARCHAR2(1000),
PAPAA               t_papaa
......
)
我需要将相应行中的数据提取到具有t_promien类型的新变量中并设置其字段,例如-EXER应具有“ATP-45”值,MSGID应具有“BIOCHEM3”,papa应具有('1KM','15KM')值(t_Papa也是我的自定义类型,它包含2个varchar字段)

在oracle PL-SQL过程中执行此操作的最佳方法是什么?我需要将所需的数据提取到out参数中。我可以用regex来做这个(怎么做?)很奇怪,我对甲骨文完全是新手,所以


你能给我一些提示吗?谢谢。

您可以使用以下方法使用
REGEXP\u SUBSTR
完成此操作:

SELECT REGEXP_SUBSTR('EXER/ATP-45/-//
MSGID/BIOCHEM3/-/-/-/-/-//
GEODATUM/UTM//
PAPAA/1KM/-//15KM/-//', 'EXER/[^/]+/', 1, 1) AS EXER
FROM DUAL;
上面重要的一位是
'EXER/[^/]+/'
,它正在寻找一个字符串,该字符串以文本
EXER/
开头,后面是一系列字符,这些字符不是
/
,以最后的
/
结尾


上述查询将返回
EXER/ATP-45/
,但您可以使用标准字符串函数,如
SUBSTR
LTRIM
RTRIM
,以删除不需要的位。

在PL/SQL中使用REGEXP\u SUBSTR的简单演示

CREATE OR REPLACE PROCEDURE TEST_REGEXP_PROC(VAR_PI_MSG IN VARCHAR2,
                                             T_PO_PAPAA OUT T_PROMIEN) AS

  VAR_L_EXER  VARCHAR2(1000);
  VAR_L_MSGID VARCHAR2(1000);

BEGIN

  SELECT SUBSTR(REPLACE(REGEXP_SUBSTR(VAR_PI_MSG, 'EXER/[^/]+/', 1, 1),'/'),5)
    INTO VAR_L_EXER
    FROM DUAL;

  T_PO_PAPAA.EXER := VAR_L_EXER;

  SELECT SUBSTR(REPLACE(REGEXP_SUBSTR(VAR_PI_MSG, 'MSGID/[^/]+/', 1, 1),'/'),6)
    INTO VAR_L_MSGID
    FROM DUAL;

  T_PO_PAPAA.MSGID := VAR_L_MSGID;  

END;

希望这能帮助您开始。

您使用的是什么版本的Oracle?不同版本的正则表达式功能有所不同。