rrudnik
5/5/2015 - 12:42 PM

Dynamic Select. Retrievals of entire rows of data for many different tables, based on their various (but single) primary key columns.

Dynamic Select. Retrievals of entire rows of data for many different tables, based on their various (but single) primary key columns.

SQL> exec genlookup ('book', 'isbn')

CREATE OR REPLACE FUNCTION book_row_for (    isbn_in IN book.isbn%TYPE)    
RETURN book%ROWTYPE 
IS 
retval  book%ROWTYPE; 
BEGIN    
SELECT * INTO retval      
	FROM book     
WHERE isbn = isbn_in;    
RETURN retval; 
EXCEPTION    
WHEN NO_DATA_FOUND THEN       
	RETURN NULL;    
WHEN OTHERS THEN       
	err.log; 
END book_row_for; 
CREATE OR REPLACE PROCEDURE genlookup (tab IN VARCHAR2, col IN VARCHAR2) 
IS    
l_ltab   VARCHAR2 (100) := LOWER (tab);    
l_lcol   VARCHAR2 (100) := LOWER (col); 
BEGIN    
pl ('CREATE OR REPLACE FUNCTION ' || l_ltab || '_row_for (');    
pl ('   ' ||           l_lcol || '_in IN ' || l_ltab || '.' || l_lcol || '%TYPE)');    
pl ('   RETURN ' || l_ltab || '%ROWTYPE');    pl ('IS');    
pl ('   retval  ' || l_ltab || '%ROWTYPE;');    
pl ('BEGIN');    
pl ('   SELECT * INTO retval');   
pl ('     FROM ' || l_ltab);    
pl ('    WHERE ' || l_lcol || ' = ' || l_lcol || '_in;');    
pl ('   RETURN retval;');    
pl ('EXCEPTION');    
pl ('   WHEN NO_DATA_FOUND THEN');    
pl ('      RETURN NULL;');    
pl ('   WHEN OTHERS THEN');    
pl ('      err.log;');    
pl ('END ' || l_ltab || '_row_for;');   
pl ('/'); 
END;