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.

Chủ đề