Thanks to twitter I found this post by Carsten Czarski on LISTAGG and CLOBS that helped my with the 4000 character limit with LISTAGG(), found when building JSON strings.
ORA-01489: result of string concatenation is too long
Update 2019: Connor now his this code in his Github.
I follow a few bi-language blogs but I do wonder if English speakers may find this post when googling the issue. For me it's on page 1 when googling "listagg clob", but I knew what keyword to search after the fact.
A little tip if you do find it - don't attempt to copy the code from the translated version of the page. It's amazing how many syntax issues were introduced by the translator, and logical issues that I wouldn't have noticed had I not performed a diff after things went wrong.
For instance, the "aggregate" keyword here vanished:
CREATE or replace FUNCTION listagg_clob (input varchar2) RETURN clob
PARALLEL_ENABLE AGGREGATE USING listagg_clob_t;
/
Thank's Carsten for a useful solution using custom aggregate functions, an element of PL/SQL I'm yet to master.
It's certainly faster than the XML solution, here is the throughput difference from 100 iterations of each.
-- listagg_clob
3.34 secs
.0334 secs per iteration
-- xmlagg
18.75 secs
.1875 secs per iteration
The simplest solution, however, would be to set up an RESTful service using ORDS.
Another workaround involves a CASE statement.
Showing posts with label XML. Show all posts
Showing posts with label XML. Show all posts
Wednesday, 4 March 2015
Wednesday, 18 April 2012
Finding stuff in ALL_VIEWS using XML
Quite some time ago when I first started blogging I wrote a post regarding limitations on searching the
Simply put, if you would like to run a query such as this to find those views that contain the text "booking_no", you're not going to get very far.
I can't remember where I found this, but there is a way to do perform this search without pumping your data into a temporary table.
A word of warning, it is CPU (and probably memory) intensive, so you might like to limit to a particular set of schemas instead of just searching
Turns out XML has some nifty uses after all ;-)
ALL_VIEWS dictionary view.Simply put, if you would like to run a query such as this to find those views that contain the text "booking_no", you're not going to get very far.
SQL> select count(*) 2 from user_views 3 where text like '%booking_no%'; where text like '%booking_no%' * ERROR at line 3: ORA-00932: inconsistent datatypes: expected NUMBER got LONG
I can't remember where I found this, but there is a way to do perform this search without pumping your data into a temporary table.
select count(*)
from user_views
where upper(dbms_xmlgen.getxml('select text from user_views where view_name = '''||view_name||''''))
like upper('%booking_no%')
It's essentially looking for "booking_no" within the result of a query that has been converted into canonical XML format.<?xml version="1.0"?> <ROWSET> <ROW> <TEXT>SELECT r.code,b.booking_no,e.start_date,e.end_date,o.org_id,o.name FROM resources r,bookings b,events e,organisations o WHERE r.code = b.resource_code AND b.event_no = e.event_no AND o.org_id = e.org_id</TEXT> </ROW> </ROWSET>
ALL_VIEWS.Turns out XML has some nifty uses after all ;-)
Subscribe to:
Posts (Atom)