Problem: How does the UTL_HTTP package use Oracle Net

Problem: How does the UTL_HTTP package use Oracle Net

I am using a command like

UTL_HTTP.set_transfer_timeout (5);

SELECT HTTPURITYPE.createuri
(   ‘http://fluffy.sf.nowhere.net:8080/rodger-admin/manageCacheFull.do?userName=
|| ‘myuser&password=password&action=update&cacheName=com.rcom.tarcaptu’
|| ‘re.prxcommon.entity.RTotal&cacheKey=9′
).getclob () web_page
INTO l_web_page
FROM DUAL;

What does TNS have to do with HTTPURITYPE (which is really utl_tcp in a wrapper). I don’t understand how TNS gets involved. It would seem to me that the implementation of utl_tcp which in written in C, would create the necessary socket etc. I understand how Oracle Net gets involved for inbound HTTP connections but for outbound connections it doesn’t make any sense.

ORA-29273: HTTP request failed
ORA-06512: at “SYS.UTL_HTTP”, line 1674
ORA-12535: TNS:operation timed out
ORA-06512: at “SYS.HTTPURITYPE”, line 34
ORA-06512: at line 6

As a side note, the error takes  3 min 44 seconds  before it happens.  It should take  5 seconds to time out, because of  the  UTL_HTTP.set_transfer_timeout (5); command.

The Question:
How can I ensure that control returns to my PL/SQL process after 5 seconds.


Solution : How does the UTL_HTTP package use Oracle Net

I’m sorry, I thought I had responded to this thread.  I must have written up my response and forgot to click send.

Anyway, if it’s still helpful…..

You can’t break out of pl/sql on a timer like that, but you can simulate it.
submit a dbms_job to retrieve your web page and then have your current session sleep (dbms_lock.sleep(5))   for 5 seconds then when it wakes up check to see if the job has completed.  If it has then read the data (presumedly the job would write it to a table for you) if it has not completed then raise an error, log it, wait again, etc.  whatever you need.

Note, 5 seconds might be too quick of a time window for the dbms_job timer to pick up your new job and complete it.  If 5 seconds is a non-negotiable hard limit, you may have to write your process in a java stored procedure that has a more robust tcp api.