/*
this was created from v$reserved words using create table as select.
my_reserved_words is just being used to demo this use case. The real
function will be in a package and use v$reserved_words.
*/
  CREATE TABLE MY_RESERVED_WORDS 
   (	"KEYWORD" VARCHAR2(30 BYTE),  
	"LENGTH" NUMBER,  
	"RESERVED" VARCHAR2(1 BYTE),  
	"RES_TYPE" VARCHAR2(1 BYTE),  
	"RES_ATTR" VARCHAR2(1 BYTE),  
	"RES_SEMI" VARCHAR2(1 BYTE),  
	"DUPLICATE" VARCHAR2(1 BYTE),  
	"CON_ID" NUMBER 
   )Table created.
Insert into MY_RESERVED_WORDS (KEYWORD,LENGTH,RESERVED,RES_TYPE,RES_ATTR,RES_SEMI,DUPLICATE,CON_ID) values ('SELECT',6,'Y','N','N','N','N',0)1 row(s) inserted.
commitStatement processed.
/*
what i'm trying to accomplish. when a string is passed, does it contain
a keyword? if so, return true if it does not contain a keyword return false.
we will assume the string can and will be passed in mixed case. therefore
we want to put an upper function on the string. This function always seems
to return false.
*/
create or replace function fReserved(sString IN VARCHAR2) RETURN BOOLEAN IS 
iCnt INTEGER; -- this is a count of the number of rows returned.  
BEGIN 
	SELECT count(*) 
	INTO iCnt 
	FROM my_reserved_words 
	WHERE UPPER(sString) LIKE '''%'||'''||keyword ||'''||'%'''; 
	-- if iCnt > 0 then we matched a reserved word in the string 
	-- return true, otherwise return false. 
	IF iCnt > 0 THEN 
		RETURN TRUE; 
	ELSE 
		RETURN FALSE; 
	END IF; 
END fReserved; Function created.
DECLARE 
BEGIN 
	-- test simple SELECT keyword. this fails because of 
	-- the appended '%' on each side of keyword in the function. 
	IF fReserved('SELECT') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED SELECT KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED SELECT KEYWORD'); 
	END IF; 
	-- test lower case select keyword.  
	IF fReserved('select') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED select KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED select KEYWORD'); 
	END IF; 
	-- test partial SEL this should return false.  
	-- we only want to match full keywords. 
	-- this passes 
	IF NOT fReserved('SEL') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED SEL KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED SEL KEYWORD'); 
	END IF; 
	-- test embedded SELECT keyword. i'm not sure why this  
	-- test fails. 
	IF fReserved('THIS IS A TEST OF SELECT EMBEDDED') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED EMBEDDED SELECT KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED EMBEDDED SELECT KEYWORD'); 
	END IF; 
	-- test embedded select keyword. i'm not sure why this 
	-- test fails. 
	IF fReserved('THIS IS A TEST OF select EMBEDDED') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED EMBEDDED select KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED EMBEDDED select KEYWORD'); 
	END IF; 
	-- test embedded sel. this should return false. we only  
	-- want to match full keywords. this test passes. 
	IF NOT fReserved('THIS IS A TEST OF sel EMBEDDED') THEN 
		SYS.DBMS_OUTPUT.PUT_LINE('PASSED EMBEDDED sel KEYWORD'); 
	ELSE 
		SYS.DBMS_OUTPUT.PUT_LINE('FAILED EMBEDDED sel KEYWORD'); 
	END IF; 
END; FAILED SELECT KEYWORD
FAILED select KEYWORD
PASSED SEL KEYWORD
FAILED EMBEDDED SELECT KEYWORD
FAILED EMBEDDED select KEYWORD
PASSED EMBEDDED sel KEYWORD