DBMS_EPG – The Embedded PL/SQL Gateway in Oracle 10g Database R2

I’ve been playing around with the DBMS_EPG package in Oracle 10g Database Release 2. This allows you to configure Database Access Descriptors (DADs) to run mod_plsql applications directly from the database without using an application server or the HTTP server from the companion CD. Instead it uses the XML DB HTTP server. I’ve written an article on it on my website:

DBMS_EPG – The Embedded PL/SQL Gateway in Oracle 10g Database R2

It definitely works, but I’ve tried it on both RHEL4 and Windows and it feels a little dodgy. I think I’ve already found one bug, mentioned in the article, but it might just be me doing something wrong. I’m not sure if it’s ready for a production application, but it’s certainly a nice idea.

Cheers

Tim…

Pipelined table functions and cursor_sharing don’t mix…

So you want to use pipelined table functions and cursor_sharing in 10.1.0. Check this out…

First create this test package:

CREATE OR REPLACE PACKAGE ptf_test AS
TYPE t_ptf_row IS RECORD (
dummy dual.dummy%TYPE
);

TYPE t_ptf_tab IS TABLE OF t_ptf_row;

FUNCTION get_data_1
RETURN t_ptf_tab PIPELINED;

FUNCTION get_data_2 (p_in IN VARCHAR2)
RETURN t_ptf_tab PIPELINED;

END;
/
SHOW ERRORS

CREATE OR REPLACE PACKAGE BODY ptf_test AS
FUNCTION get_data_1
RETURN t_ptf_tab PIPELINED
AS
l_row t_ptf_row;
BEGIN
SELECT dummy
INTO l_row
FROM dual;

PIPE ROW(l_row);
RETURN;
END;

FUNCTION get_data_2 (p_in IN VARCHAR2)
RETURN t_ptf_tab PIPELINED
AS
l_row t_ptf_row;
BEGIN
SELECT dummy
INTO l_row
FROM dual;

PIPE ROW(l_row);
RETURN;
END;
END;
/
SHOW ERRORS

Then turn on cursor_sharing and query the pipelined table functions:

SQL> ALTER SESSION SET CURSOR_SHARING=SIMILAR;

Session altered.

SQL> SELECT *
2  FROM TABLE(ptf_test.get_data_1);

D
-
X

1 row selected.

SQL> SELECT *
2  FROM TABLE(ptf_test.get_data_2('x'));
FROM TABLE(ptf_test.get_data_2('x'))
*
ERROR at line 2:
ORA-22905: cannot access rows from a non-nested table item

SQL>

Now turn it off and try again:

SQL> ALTER SESSION SET CURSOR_SHARING=EXACT;

Session altered.

sys@db10g> SELECT *
2  FROM TABLE(ptf_test.get_data_1);

D
-
X

1 row selected.

SQL> SELECT *
2  FROM TABLE(ptf_test.get_data_2('x'));

D
-
X

1 row selected.

SQL>

So you can’t use cursor_sharing and pipelined table functions with parameters together. It took me a while to figure out the problem, but when I did it wasn’t long before support came back with an unfixed bug relating to it (Bug 4178323).

The solution? Don’t use cursor_sharing 🙂

Cheers

Tim…

Note. Script changed to use ALTER SESSION to prevent anyone leaving their test instance in an dodgy state. Thanks for the heads-up Gary 😉

The first rating mystery…

There seems to be a strange pattern to the article ratings on my website. When I put a new article live it nearly always gets a 5 star rating by the first couple of reviewers, then over time drops to somewhere around the 3 star zone. I wonder if I have a couple of fans who give me 5 stars no matter what, then the realists kick in and it gets pulled down to a more realistic rating. 🙂

Cheers

Tim…

Weird issue hidden by outlines…

I used a stored outline in a production environment for the first time yesterday. I can’t say I’ve ever seen the need to do this before, but this time it masked a pretty serious problem. Normally I try to let the optimizer do its own thing. I even avoid optimizer hints if I can, but in this case the stored outline was the only solution.

The issue was that an SQL statement generated by a finder method in a J2EE application was acting differently depending on JDBC driver being used to make the database connection. When the connection was made via the thin driver the SQL statement used the correct execution plan and worked real quick. When the OCI driver was used the same SQL statement was using a ridiculous index, causing it to trawl through loads of data, making it take around 4 seconds to complete. In this case the impact was massive as this same statement is executed many times throughout the system.

This begs two questions:

  • Why is it happening?
  • Is there a way to force a good execution plan until we can solve the real issue?

The answer to the first questions is still under investigation, but my answer to the second questions was to use optimizer hints! Nice idea, but it won’t work! Unfortunately the SQL is generated at runtime by the OC4J container so we have little influence over the actual statement produced. Then I thought *stored outlines*. A couple of minutes later I had created an outline for the query and both drivers were giving the same performance!

I knocked up a quick article on Stored Outlines and Plan Stability on my website.

In this case the stored outline saved my bacon by hiding a problem until we can resolve it, but they kinda scare me. When you add a hint to an SQL statement it’s there for the whole world to see. People will only know the outline exists if I tell them about it. It’s going to be really easy for everyone to forget about it, then get confused when another environment doesn’t react in the same way.

I guess I’ll put stored outlines in the same category as triggers. Useful at times, but avoid if possible because sooner or later they are going to screw you up 🙂

My list of things to do now includes:

  • Find out why the same statement acts differently with the two drivers.
  • Try to convince everyone that not every SQL problem we’ve ever had can be fixed using stored outlines.
  • Convince the world that Java is a great language, but J2EE sucks. Runtime generation of SQL is certainly fuel for the fire 🙂

Cheers

Tim…

PS. The latest IOUG SELECT magazine has one of my articles in it. I even made the front page. If you’re bored turn to page 6 and check it out. Next stop Rolling Stone…

Can you answer this question…

I’ve just been asked a question on mass loading of images into the database (Optimizing BLOBs for SQL*Loader) and to be perfectly honest I’m not sure what the best solution is.

I’ve worked on a number of projects where images are stored in the database, but in all cases the images have been loaded on a one-by-one basis as they arrived. Apart from exports and imports between schemas I can’t remember ever doing mass loads of images into the database.

Anyone got any suggestions, preferably based on experience of this?

Cheers

Tim…

Ong Bak

I watched a martial arts movie called Ong Bak last night that stared a guy called Tony Jaa (Panom Yeerum). The film was low budget and the English dubbing was terrible, but the fighting sequences were amazing.

This guy is a serious talent. He’s a Muay Thai guy, so there is plenty of shin kicks, shin blocks elbow strikes, but there is also plenty of flashy movie stuff. It’s especially amazing when you consider that the fighting scenes are done without CGI or wire-work.

I always go on about how Jet Li is the most complete martial artist I’ve seen, but I think Tony Jaa can do some stuff that would make Jet Li weep! If he’s managed and promoted correctly I think he could eclipse Bruce Lee! Did I really say that?

Cheers

Tim…

First night in a tent…

Last night was the first night I’ve ever spent in a tent. I’ve never really liked the thought of it so I’ve never tried it before, but I was invited to friend’s 40th birthday party and a night in a tent was kinda mandatory.

I woke up early and was packing away my tent as some of my friends were going to bed. I get the feeling I’ll remember more about the evening than several of them 🙂

The verdict? I enjoyed putting the tent up and taking it down, even though it was raining and windy on both occasions. As for the sleeping thing, I didn’t dislike the experience, but it’s not something I’m desperate to repeat either. I guess the circumstances will dictate whether I ever venture into a tent again…

I’m off on holiday tomorrow, strictly no tents, so I guess things will be a little quiet unless I stumble on an internet cafe.

Cheers

Tim…

Exit mobile version