Hướng dẫn convert html to text in oracle sql - chuyển đổi html thành văn bản trong oracle sql

Tôi đang viết một chức năng PL/SQL sẽ chuyển đổi HTML thành văn bản thuần túy, nhưng vẫn bảo tồn một số lỗi định dạng/dòng. Một trong những thách thức của tôi là viết một biểu thức chính quy để nắm bắt các khối văn bản trong khi bỏ qua đánh dấu. Tôi đang cố viết một biểu thức sẽ lấy tất cả các văn bản giữa các thẻ bắt đầu/kết thúc, nhưng loại bỏ các thẻ. Ví dụ: để tìm tất cả văn bản giữa đoạn bắt đầu/kết thúc, tôi muốn làm một cái gì đó như:

Regexp_replace ('& lt; p style = & quot; văn bản-align: Center ; & quot; & gt; Đây là cơ thể của đoạn văn & lt;/p & gt;', '& lt; p. p & gt; ',' \ 1 || v_crlf ')

trong đó \ 1 trả về nội dung của đoạn và V_CRLF (được khai báo trước đó trong hàm) chèn một đường ngắt. Tôi biết có nhiều biểu thức chung hơn sẽ xóa tất cả các thẻ, nhưng tôi muốn xác định cụ thể các thẻ để tôi có thể xử lý chúng một cách thích hợp. Bằng cách này, tôi có thể dễ dàng chuyển đổi HTML thành văn bản đơn giản cho email và báo cáo mà không phải giữ hai phiên bản xung quanh. Mọi sự trợ giúp sẽ rất được trân trọng. Khi tôi nhận được điều này, tôi sẽ đăng lại mã chức năng cho người khác sử dụng. Cảm ơn.

Được chỉnh sửa bởi: Jritschel vào ngày 26 tháng 10 năm 2010 9:58 sáng

Chưa bao giờ phải hỗ trợ các cột dài trong đỉnh. Đối với màn hình HTML, người ta có thể sử dụng các vùng động PL/SQL cho CLOB, hãy gói Clob vào các phần tử HTML trước.

Người ta có thể chuyển đổi một thời gian dài thành CLOB như sau:

create or replace function LongToClob( refcur in out sys_refcursor ) return clob authid current_user is 
-- refcursor is expected to be a single row with a single LONG colums - with this function returning 
-- the LONG as a CLOB 
-- (refcursor can also be replaced as parameter with a SQL select source statement and function modified 
-- to parse that as oppose to getting an already parsed cursor as parameter( 
       c              integer; 
       cols           integer; 
       colStruct      dbms_sql.desc_tab3; 
       rc             integer; 
 
       strBuf         varchar2(32767); 
       bufLen         constant number := 32767; 
       bytesRd        integer; 
       currPos        integer; 
       buffer         clob; 
 
       procedure assert( assertion boolean, errorMessage varchar2 ) is 
       begin 
               if not assertion then 
                       raise_application_error( -20000, errorMessage ); 
               end if; 
       end; 
 
begin 
       -- convert ref cursor to a DBMS_SQL cursor (if SQL select statement is used as parameter, 
       -- create and parse the cursor instead, using that SQL statement) 
       c := dbms_sql.to_cursor_number( refcur ); 
 
       -- get the SQL projection and confirm it is a single LONG column 
       dbms_sql.describe_columns3( c, cols, colStruct ); 
       assert( cols = 1, 'Cursor''s SQL projection is expected to have a single column. It has '||cols||' columns.' ); 
       assert( colStruct(1).col_type = 8, 'Projected column '||colStruct(1).col_name||' is not of type LONG.' ); 
 
       -- define col 1 as to be fetched as a long data type 
       dbms_sql.define_column_long( c, 1 ); 
 
       -- exec and fetch 
       rc := dbms_sql.fetch_rows( c ); 
 
       -- if we have a row, convert its long to a clob 
       if rc = 1 then 
               dbms_lob.CreateTemporary( buffer, true ); 
               bytesRd := bufLen; 
               currPos := 0; 
 
               while bytesRd > 0 loop 
                       dbms_sql.column_value_long( c, 1, bufLen, currPos , strBuf, bytesRd ); 
                       currPos := currPos + bytesRd; 
                       if bytesRd > 0 then 
                               dbms_lob.WriteAppend( buffer, bytesRd, strBuf ); 
                       end if; 
               end loop; 
       end if; 
 
       rc := dbms_sql.fetch_rows( c ); 
       assert( rc = 0, 'Multiple rows detected in cursor. Only a single row expected.' ); 
 
       dbms_sql.close_cursor( c ); 
       return( buffer ); 
end; 
/ 
show errors

Cách sử dụng:

SQL> var ref refcursor 
SQL> var c     clob 
SQL> exec open :ref for select text from all_views where view_name = 'DBA_CONTAINER_DATA'; 
 
PL/SQL procedure successfully completed. 
 
SQL> exec :c := LongToClob(:ref); 
 
PL/SQL procedure successfully completed. 
 
SQL> print c 
 
C 
-------------------------------------------------------------------------------- 
select attr_u.name, 'N', owner_u.name, obj_o.name, 
      decode(cd.con#, 0, 'Y', 'N'), con_o.name 
 from sys.condata$ cd, sys."_BASE_USER" attr_u, 
      sys."_CURRENT_EDITION_OBJ" obj_o, sys.int$container_obj$ con_o, 
      sys."_BASE_USER" owner_u 
 where cd.user# = attr_u.user# 
   and cd.obj# != 0 
   and cd.obj# = obj_o.obj# 
   and obj_o.owner# = owner_u.user# 
   and cd.con# = con_o.con_id (+) 
   and (cd.con# = 0 or con_o.con_id is not NULL) 
union all 
select attr_u.name, 'N', 'SYS', obj_o.name, 
      decode(cd.con#, 0, 'Y', 'N'), con_o.name 
 from sys.condata$ cd, sys."_BASE_USER" attr_u, 
      sys.v$fixed_table obj_o, sys.int$container_obj$ con_o 
 where cd.user# = attr_u.user# 
   and cd.obj# != 0 
   and cd.obj# = obj_o.object_id 
   and cd.con# = con_o.con_id (+) 
   and (cd.con# = 0 or con_o.con_id is not NULL) 
union all 
select attr_u.name, 'Y', NULL, NULL, 
      decode(cd.con#, 0, 'Y', 'N'), con_o.name 
 from sys.condata$ cd, sys."_BASE_USER" attr_u, 
      sys.int$container_obj$ con_o 
<snipped> 

Bạn cũng có thể đọc và hiển thị CLOB dưới dạng các dòng cá nhân bằng cách tìm kiếm các thiết bị đầu cuối dòng trong vùng động Apex PL/SQL. Hoặc tạo chức năng bảng đường ống trả về các dòng dưới dạng các hàng và sử dụng nó như SQL CHỌN cho vùng báo cáo Apex.