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/
,但您可以使用SUBSTR
、LTRIM
或RTRIM
等标准字符串函数来删除不需要的位。
【讨论】:
【参考方案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