Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.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
Oracle 从CLOB字段中提取文本_Oracle_Extract_Toad_Clob - Fatal编程技术网

Oracle 从CLOB字段中提取文本

Oracle 从CLOB字段中提取文本,oracle,extract,toad,clob,Oracle,Extract,Toad,Clob,我的Oracle数据库中有一个CLOB字段,它以以下格式存储文本数据: __99__RU_LOCKED=N;;__99__RU_SUSPENDED=Y;;__17__USER_TYPE=A;;__17__USER_TYPE_610=A;;__17__GUIFLAG=0;;__17__DEFAULT_LANG_610=E;;__17__OUTPUT_DEVICE_46=LOCL;;__17__PRINT_IMMED=G;;__17__DELETE_AFTER_PRINT=D;;__17__CATT

我的Oracle数据库中有一个CLOB字段,它以以下格式存储文本数据:

__99__RU_LOCKED=N;;__99__RU_SUSPENDED=Y;;__17__USER_TYPE=A;;__17__USER_TYPE_610=A;;__17__GUIFLAG=0;;__17__DEFAULT_LANG_610=E;;__17__OUTPUT_DEVICE_46=LOCL;;__17__PRINT_IMMED=G;;__17__DELETE_AFTER_PRINT=D;;__17__CATT=*BLANK;;__17__CATT_46=*;;__17__DEC_FORMAT=*BLANK;;__17__DEC_FORMAT_46=X;;__17__DATE_FORMAT=2;;__17__PARAMETERS=OM_OBJM_NO_DISPLAYX;;__17__MEAS_EASLPFL=0;;__17__USER_GROUP=S1BR22;;__17__VALID_FROM=20080222;;__17__VALID_UNTIL=99991231;;__17__ACCOUNT=37004968;;
我正在使用TOAD,在创建查询时,我可以通过以下内容读取CLOB字段:

--- To read the CLOB field.
select DBMS_LOB.substr(ADD_INFO_MASTER) from USER
此选择返回给我CLOB字段人类可读

我的问题是:有没有办法从上面的行中提取一个单一的值,比如账户值? 请记住,此CLOB字段可能会发生变化,_17__ACCOUNT=不会每次都在同一个位置。我需要一种提取方法来定位__17_uuaccount=(这将是一个模式)并提取值37004968


在TOAD中执行查询时可以实现这一点?

您可以使用正则表达式提取值:

WITH your_table AS (
SELECT '__99__RU_LOCKED=N;;__99__RU_SUSPENDED=Y;;__17__USER_TYPE=A;;__17__USER_TYPE_610=A;;__17__GUIFLAG=0;;__17__DEFAULT_LANG_610=E;;__17__OUTPUT_DEVICE_46=LOCL;;__17__PRINT_IMMED=G;;__17__DELETE_AFTER_PRINT=D;;__17__CATT=*BLANK;;__17__CATT_46=*;;__17__DEC_FORMAT=*BLANK;;__17__DEC_FORMAT_46=X;;__17__DATE_FORMAT=2;;__17__PARAMETERS=OM_OBJM_NO_DISPLAYX;;__17__MEAS_EASLPFL=0;;__17__USER_GROUP=S1BR22;;__17__VALID_FROM=20080222;;__17__VALID_UNTIL=99991231;;__17__ACCOUNT=37004968;;' clob_field FROM DUAL
) 
SELECT REGEXP_SUBSTR(clob_field,'__17__ACCOUNT=.*;;')
FROM your_table
使用它,您将得到“uu 17_uuuaccount=37004968;;”。您可以使用SUBSTR轻松提取值


我认为在Oracle 11g REGEXP_SUBSTR中有额外的参数,可以让您提取正则表达式中的某个组。

您可以将INSTR和SUBSTR与CLOB数据类型一起使用:

WITH T1 AS (
SELECT '__99__RU_LOCKED=N;;__99__RU_SUSPENDED=Y;;__17__USER_TYPE=A;;__17__USER_TYPE_610=A;;__17__GUIFLAG=0;;__17__DEFAULT_LANG_610=E;;__17__OUTPUT_DEVICE_46=LOCL;;__17__PRINT_IMMED=G;;__17__DELETE_AFTER_PRINT=D;;__17__CATT=*BLANK;;__17__CATT_46=*;;__17__DEC_FORMAT=*BLANK;;__17__DEC_FORMAT_46=X;;__17__DATE_FORMAT=2;;__17__PARAMETERS=OM_OBJM_NO_DISPLAYX;;__17__MEAS_EASLPFL=0;;__17__USER_GROUP=S1BR22;;__17__VALID_FROM=20080222;;__17__VALID_UNTIL=99991231;;__17__ACCOUNT=37004968;;' TEXT FROM DUAL
) 
SELECT SUBSTR(TEXT, 
              INSTR(TEXT, '__17__ACCOUNT=') + LENGTH('__17__ACCOUNT') + 1, -- find the first position of the value
              INSTR (TEXT, ';;', INSTR(TEXT, '__17__ACCOUNT=')) - (INSTR(TEXT, '__17__ACCOUNT=') + LENGTH('__17__ACCOUNT') + 1)  -- length to read. Difference between the end position (the first ;; after your placeholder) and the value start position (the same value as above)
             )
  FROM T1;

但是,我更喜欢pablomatico提出的REGEXP解决方案。

如果要处理长度大于4000个符号(Oracle 11g)或32K(Oracle 12c)的CLOB值,则必须使用

此包包含在LOB上运行的和函数

在您的情况下,查询如下所示:

with prm as (
  select '__17__ACCOUNT' as fld_start from dual
)
select 
  dbms_lob.substr(
    text,         
    -- length of substring             
    (  
      -- position of delimiter found after start of desired field 
      dbms_lob.instr(text, ';;', dbms_lob.instr(text, prm.fld_start)) 

      -

      -- position of the field description plus it's length
      ( dbms_lob.instr(text, prm.fld_start) + length(fld_start) + 1 )
    ),

    -- start position of substring
    dbms_lob.instr(text,prm.fld_start) + length(fld_start) + 1
  )  
from 
  text_table,
  prm
上面的查询使用此设置:

create table text_table(text clob);

insert into text_table(text) values (
  '__99__RU_LOCKED=N;;__99__RU_SUSPENDED=Y;;__17__USER_TYPE=A;;__17__USER_TYPE_610=A;;__17__GUIFLAG=0;;__17__DEFAULT_LANG_610=E;;__17__OUTPUT_DEVICE_46=LOCL;;__17__PRINT_IMMED=G;;__17__DELETE_AFTER_PRINT=D;;__17__CATT=*BLANK;;__17__CATT_46=*;;__17__DEC_FORMAT=*BLANK;;__17__DEC_FORMAT_46=X;;__17__DATE_FORMAT=2;;__17__PARAMETERS=OM_OBJM_NO_DISPLAYX;;__17__MEAS_EASLPFL=0;;__17__USER_GROUP=S1BR22;;__17__VALID_FROM=20080222;;__17__VALID_UNTIL=99991231;;__17__ACCOUNT=37004968;;'
);  
对于开发工具的日常使用,定义一个函数,返回具有所需名称的字段值,并使用它,而不是每次编写复杂的表达式,这可能会很有用。
例如:

用法:

select get_field_from_text(text,'__17__OUTPUT_DEVICE_46') from text_table
select get_field_from_text(text,'__17__OUTPUT_DEVICE_46') from text_table