Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Re: ConText CONTAINS in PL/SQL
Mainly because you have to manage all the temporary tables, which are
a bunch of arse, especially if you are wanting to do a union or using
OWA or somthing like that, where you are doing lots of repeat queries
frequently and have to manage the whole lot through a single results
table with sessionids and the like. ugh! And then try catching
meaningful errors.
here's how I did it:
procedure searchcat(
searchtext in varchar2 DEFAULT NULL, searchmode in char DEFAULT NULL, deptid in char DEFAULT NULL, contid in char DEFAULT NULL) is TYPE csearchrowtyp is record (cs_coursecode course.coursecode%type, cs_score integer, cs_trainingunit course.trainingunit%type, cs_title course.title%type, cs_order varchar2(2)); TYPE csearchcurtyp is REF CURSOR RETURN csearchrowtyp; csearch csearchcurtyp; cc csearchrowtyp; i integer; t integer; t1 integer; t2 integer; t3 integer; s varchar2(2000); d varchar2(50); stop_word exception; pragma exception_init(stop_word,-20000); begin -- only search if there is an argument s:=replace(searchtext,' ',' '); s:=ltrim(s,' '); s:=rtrim(s,' '); if s is not null then -- ensure no multiple spaces and lead and trail space is present if searchmode='ANY' then s:=replace(s,' ','}, {'); s:='{' || s || '}'; end if; if searchmode='ALL' then s:=replace(s,'*','%'); end if; if s='%' then -- special for wildcard only match insert into ctxres1 select coursecode,userenv('sessionid'),10 from course; commit; else -- perform text query
ctx_query.contains('course_title',s,'ctxres1',1,userenv('sessionid'));
ctx_query.contains('course_keywords',s,'ctxres2',1,userenv('sessionid'));
ctx_query.contains('course_content',s,'ctxres3',1,userenv('sessionid'));
delete from ctxres2 where
conid=userenv('sessionid') and
textkey in (select textkey from ctxres1 where conid=userenv('sessionid')); delete from ctxres3 where conid=userenv('sessionid') and textkey in (select textkey from ctxres1 where conid=userenv('sessionid')); delete from ctxres3 where conid=userenv('sessionid') and textkey in (select textkey from ctxres2 where conid=userenv('sessionid')); commit; end if; if deptid='ALL' then -- all depts select count(*) into t1 from ctxres1 where conid=userenv('sessionid'); select count(*) into t2 from ctxres2 where conid=userenv('sessionid'); select count(*) into t3 from ctxres3 where conid=userenv('sessionid'); t:=t1+t2+t3; open csearch for select textkey,score,trainingunit,title,'1' from ctxres1 a, course b where textkey=coursecode and conid=userenv('sessionid') union select textkey,score,trainingunit,title,'2' from ctxres2 c, course d where textkey=coursecode and conid=userenv('sessionid') union select textkey,score,trainingunit,title,'3' from ctxres3 c, course d where textkey=coursecode and conid=userenv('sessionid') order by 5, 2 desc, 4; elsif deptid != 'ALL' then -- a dept select count(*) into t1 from ctxres1, course where conid=userenv('sessionid') and textkey=coursecode and trainingunit=deptid; select count(*) into t2 from ctxres2, course where conid=userenv('sessionid') and textkey=coursecode and trainingunit=deptid; select count(*) into t3 from ctxres3, course where conid=userenv('sessionid') and textkey=coursecode and trainingunit=deptid; t:=t1+t2+t3; open csearch for select textkey,score,trainingunit,title,'1' from ctxres1, course where textkey=coursecode and conid=userenv('sessionid') and trainingunit=deptid union select textkey,score,trainingunit,title,'2' from ctxres2, course where textkey=coursecode and conid=userenv('sessionid') and trainingunit=deptid union select textkey,score,trainingunit,title,'3' from ctxres3, course where textkey=coursecode and conid=userenv('sessionid') and trainingunit=deptid order by 5, 2 desc, 4; end if; fetch csearch into cc; if (contid is not null) and (contid != 'ALL') then -- continuing a previous search while cc.cs_coursecode != contid loop fetch csearch into cc; exit when csearch%NOTFOUND; end loop; end if; if csearch%FOUND then -- output the results else -- never found any results searchform('NO ITEMS FOUND',searchtext); end if; -- clean up the mess left by context close csearch; delete from ctxres1 where conid=userenv('sessionid'); delete from ctxres2 where conid=userenv('sessionid'); delete from ctxres3 where conid=userenv('sessionid'); commit; else searchform('NO SEARCH WORD ENTERED'); end if; exception when stop_word then searchform('INVALID SEARCH WORD ENTERED',searchtext); when others then htp.htmlOpen; htp.headOpen; htp.Title('Catalogue Search Error'); htp.headClose; htp.bodyOpen; htp.p(sqlerrm); htp.p('<br>A system error has occured. Please correct the problem, press back, and try again.'); htp.bodyClose; htp.htmlClose;
On Tue, 19 Jan 1999 06:37:33 GMT, bonanos_at_yahoo.com wrote:
>Why don't you just use a two step query?
>I can't see why the original poster would prefer to use a one step.
>
>
>In article <36A33E95.59A900C4_at_berlin.de>,
> "Rüdiger J. Schulz" <r.schulz_at_berlin.de> wrote:
>> u are right! the only way - in the moment - is to try the following way with
>> dynamic-sql:
>>
>> CREATE OR REPLACE PROCEDURE yyy.ctxcheck
>> (mSuch VARCHAR2)
>> IS
>> mxxxid NUMBER;
>> xrows NUMBER;
>> xcur NUMBER;
>> xquery VARCHAR2(2000);
>> BEGIN
>> xcur := DBMS_SQL.OPEN_CURSOR;
>> xquery := 'Select xxxid from yyy.data Where contains(volltext,
>> '||chr(39)||mSuch||chr(39)||') > 0';
>> DBMS_OUTPUT.PUT_LINE(xquery);
>> DBMS_SQL.PARSE(xcur, xquery, DBMS_SQL.V7);
>> DBMS_SQL.DEFINE_COLUMN(xcur,1,mxxxid);
>> xrows := DBMS_SQL.EXECUTE(xcur);
>> IF xrows > 0 THEN
>> xrows := DBMS_SQL.FETCH_ROWS(xcur);
>> DBMS_SQL.COLUMN_VALUE(xcur,1,mxxxid);
>> ELSE
>> mxxxid := 0;
>> END IF;
>> DBMS_OUTPUT.PUT_LINE( mxxxid );
>> END;
>> /
>> show errors;
>>
>> Richard Murphy schrieb:
>>
>> > That does not work from within a PL/SQL block. For some reason PL/SQL does
>> > not recognize the CONTAINS function. It works fine using SQL or embedded
>> > SQL (ProC), but not from within a block - i get a CONTAINS not declared
>> > error.
>> >
>> > Thanks though, R.
>> >
>> > "Rüdiger J. Schulz" wrote:
>> >
>> > > try the following sql-statement for a one-step-query:
>> > >
>> > > select test1, test2 from tablename where CONTAINS(test1,
>> > > 'searchvalue') > 0;
>> > >
>> > > (here is test1 the column on which the context-policy runs)
>> > >
>> > > Richard Murphy schrieb:
>> > >
>> > > > Anyone know how to access the ConText CONTAINS function from within a
>> > > > PL/SQL block? Most likely the only way is a two step query, but would
>> > > > prefer a one step query.
>> > > >
>> > > > Thanks, R.
>> > >
>> > > --
>> > > b e r l i n . d e - d e r o n l i n e d i e n s t d e r s t
>> > > a d t
>> > > ___________________________________________________________
>> > > Primus-Online Berlin-Brandenburg GmbH & Co. KG
>> > > debis Haus am Potsdamer Platz
>> > > 10875 Berlin
>> > >
>> > > Rüdiger J. Schulz
>> > > Technik
>> > >
>> > > tel: +49 (30) 2554-1497
>> > > fax: +49 (30) 2554-3725
>> > > email: r.schulz_at_berlin.de
>> > > homepage: http://www.berlin.de
>>
>> --
>> b e r l i n . d e - d e r o n l i n e d i e n s t d e r s t a d t
>> ___________________________________________________________
>> Primus-Online Berlin-Brandenburg GmbH & Co. KG
>> debis Haus am Potsdamer Platz
>> 10875 Berlin
>>
>> Rüdiger J. Schulz
>> Technik
>>
>> tel: +49 (30) 2554-1497
>> fax: +49 (30) 2554-3725
>> email: r.schulz_at_berlin.de
>> homepage: http://www.berlin.de
>>
>>
>
>-----------== Posted via Deja News, The Discussion Network ==----------
>http://www.dejanews.com/ Search, Read, Discuss, or Start Your Own
Received on Thu Jan 21 1999 - 11:22:56 CST