Search code examples
oracle-databaseclob

RTRIM(CLOB field) in Oracle PL/SQL


Please suppose I have a CLOB field in an Oracle table, in which I have stored the creation script of a package/procedure/function.

I would like to remove all blanks at the end of every line, but:

a) DBMS_LOB.TRIM (CLOB field) is a procedure and not a function; b) RTRIM (CLOB) don't fail, but does not work to achieve this.

How can I solve my problem?

Please note that the spaces at the beginning of every line are useful for indentation of the PL/SQL source code stored in the CLOB field, so they haven't to be removed.

Thank you in advance for your kind help and cooperation.


Solution

  • To remove spaces at the end of each line you could use regexp_replace() regular expression function:

    regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10)) 
    

    Here is an example(Note: replace function is used just to highlight spaces):

    with t1(col) as(
      select to_clob('begin  '||chr(10)||chr(32)||chr(32)||'something is going on here'||chr(32)||chr(32)||chr(10)|| 'end'||chr(32)||chr(32))
        from dual
    )
    select replace(col, ' ', '_') as with_spaces
         , replace(
                   regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10))
                   , ' '
                   , '_'
                   ) as without_spaces
      from t1
    

    Result:

    WITH_SPACES                           WITHOUT_SPACES
    ---------------------------------------------------------------------
    begin__                               begin
    __something_is_going_on_here__        __something_is_going_on_here
    end__                                 end