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

Posted

技术标签:

【中文标题】Oracle (pl-sql) - 如何从文本中提取特定数据到对象类型变量中?【英文标题】:Oracle (pl-sql) - how to extract particular data from text into object type variable? 【发布时间】:2013-01-24 07:36:40 【问题描述】:

我将文本作为 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',PAPAA 应该有 ('1KM' ,'15KM') 值(t_papaa 也是我的自定义类型,它包含 2 个 varchar 字段)。

在 oracle PL-SQL 过程中执行此操作的最佳方法是什么?我需要将所需的数据提取到 out 参数中。我可以为此使用正则表达式吗(如何?)不幸的是,我完全是 oracle 的新手,所以...

你能给我一些建议吗?谢谢。

【问题讨论】:

您使用的是什么版本的 Oracle?正则表达式功能因版本而异。 【参考方案1】:

您可以使用REGEXP_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/,但您可以使用SUBSTRLTRIMRTRIM 等标准字符串函数来删除不需要的位。

【讨论】:

【参考方案2】:

在PL/SQL中使用REGEXP_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 (pl-sql) - 如何从文本中提取特定数据到对象类型变量中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PL-SQL 在 Oracle 中获取列数据类型

如何编写触发器来检查工资是不是超出工资的最小或最大范围pl-sql Oracle

通过添加嵌入在 PL-SQL(Oracle 函数)中的 select 子句来处理异常

oracle和mysql区别

Oracle PL-SQL 函数未返回 true

PL-SQL Developer 配置使用Oracle客户端连接