Friday, 18 October 2013

A Post About Me

Hi All,

I just writing a small post to say I recently put live my own personal website so visit me at I'm currently doing some freelance web design and you can contact me through my site.

I also designed a website for a great writer Sandra Agard which can be seen at

Last thing I'm also selling some stock photography while I test out an app called foap. If you want to check it out visit me here

O.k. plug over next post will be back to programming.

Thanks for reading

Tuesday, 30 July 2013

Replace varchar in CLOB with CLOB

I was trying to do a replace within a CLOB. The problem I ran into was that either the original CLOB, the replacement CLOB or the final result would exceed the 32k limit for oracle String functions like REPLACE. Here is some code that allows you to replace a part of a CLOB with another CLOB no matter the size.
It uses dbms_lob.copy

FUNCTION replace_clob( p_lob IN CLOB,
                       p_what IN VARCHAR2,
                       p_with IN CLOB )
    n NUMBER;
    l_result CLOB := p_lob;
    n := dbms_lob.INSTR( p_lob, p_what);  
    IF ( NVL(n,0) > 0 )
            dbms_lob.createtemporary(l_result, FALSE, dbms_lob.CALL);
            dbms_lob.copy(l_result, p_lob, n - 1, 1, 1);
                          dbms_lob.getlength(p_with) ,
                          dbms_lob.getlength(l_result) + 1,
                          1 );
                          dbms_lob.getlength(p_lob) - (n + LENGTH(p_what)) + 1 ,
                          dbms_lob.getlength(l_result) + 1,
                          n + LENGTH(p_what) );
    END IF;
    IF NVL(dbms_lob.INSTR(l_result, p_what), 0) > 0 THEN
        RETURN replace_clob(l_result, p_what, p_with);
    END IF;
    RETURN l_result;

Hope this helps as I couldn't find this particular solution anywhere else

Friday, 14 June 2013

Running a PL/SQL Process from Column Link

I recently had the problem where I needed to run a pl/sql process after clicking a column link. To run this process I needed a value from the table. I then needed to navigate to a new page and set an item with a value calculated in the process. Below is my solution. If you have a simpler solution please leave me a comment.

First create an intermediate page where you will run your process.
- create a blank page (for this example we will call this process page)
- create a html region on this page
- create a hidden item to receive the value from the table.

- go to your page with the report (we will call this report page)
- create a column link to process page that passes the value from the report to your hidden item on process  page

- go back to process page
- create a Before Header process
- add code to calculate result, send the result value to an item on the target page (we will use 20 as target page and P20_RESULT as target item). Then redirect to target page

example code:

v_result number; --calculated value will go here
--Code goes here to calculate result

--set the value on the target page

-- redirect to target page


Tuesday, 11 June 2013

Displaying Large CLOBS in Oracle APEX

I had a problem retrieving a clob from the database and displaying it in an apex text area.  The reason for this is it is a very large clob and Apex areas have a 32k character (byte) limit. This is because PL/SQL treats oracle apex page items as varchars not clobs and varchars have a maximum size. Anything over that size will not be displayed properly.

So a PL/SQL process such as

select clob_field
into :P20_CLOB_ITEM
from table
where id = :P20_CLOB_ID

won't work for very large clobs. It won't throw an error it just won't display

To get round this problem you have to use apex.ajax.clob. This uses collections to process large clobs and write them to the text area. Firstly you need to select the CLOB into the collection using the following procedure. Run this on the same page that has the id value for the row that you are getting the clob from

l_clob clob:= empty_clob();


if apex_collection.collection_exists(p_collection_name=>'CLOB_CONTENT') then
end if;

dbms_lob.createtemporary( l_clob, false, dbms_lob.SESSION );

select clob_field
into l_clob
from table
where id = :P19_CLOB_ID;

apex_collection.add_member(p_collection_name => 'CLOB_CONTENT',p_clob001 => l_clob);

Then on the page with the text area put the following javascript code in the HTML Header of the page

<script type="text/javascript">
function clob_get(){
        var clob_ob = new apex.ajax.clob(
                var rs = p.readyState
                if(rs == 1||rs == 2||rs == 3){
                }else if(rs == 4){
                }else{return false;}

p.responseText retrieves the clob value from the collection CLOB_CONTENT

then call the javascript. in my case I place this in the html body of the page

onload = "javascript:clob_get();"

Hope this helps as it caused me quite a few problems.

for more on how to use this check out a blog post that was very helpful to me in solving this problem