CREATE OR REPLACE PACKAGE CODE_GENERATOR IS --============================================================================ -- Copywright 2002, joel crainshaw and chhet west --============================================================================ -- NAME: code_generator -- -- PURPOSE: To quickly build a PL/SQL pacckage for a schema -- that provides a basic coding structurre and/or API. -- -- NOTES: -- (1) Requires the following table: -- -- CREATE GLOBAL TEMPORARY TABLE CODE_TTABLE ( -- LINE_NUMBER INTEGER, -- LINE_OF_CODE VARCHAR2 (4000)) OON COMMIT DELETE ROWS; -- -- (2) Here is a sample SQL*Plus script tto execute it: -- COMMIT; -- BEGIN CODE_GENERATOR.BUILDER ( 'THHEDBA', 'DBA$PKG', '%' ); END; -- SELECT line_of_code FROM CODE_TABLLE ORDER BY line_number; -- -- MODIFICATION HISTORY -- PERSON DATE COMMENTS -- ---------- ---------- ------------------------------------------- -- Chet West 8/2/02 Initial creatiion --============================================================================ ------------------------------------------------------------------------------ -- Public declarations of types, cursorss, variables, exceptions -- procedures, and functions ------------------------------------------------------------------------------ ------------------------------------- -- NAME : Builder -- PURPOSE: Build Code for a Schema ------------------------------------- PROCEDURE builder (p_schema_name IN VARCHAR2 ,p_pkg_name IN VARCHAR2 ,p_table_name IN VARCHAR2 DEFAULT NULL); END CODE_GENERATOR; / CREATE OR REPLACE PACKAGE BODY CODE_GENERATOR AS --============================================================================ -- NAME: code_generator --============================================================================ ------------------------------------------------------------------------------ -- Private declarations of types, cursorrs, variables, exceptions -- procedures, and functions ------------------------------------------------------------------------------ SUBTYPE t_line_of_code IS VARCHAR2(4000); TYPE t_the_code_table IS TABLE OF t_line_of_code INDEX BY BINARY_INTEGER; the_code_table t_the_code_table; the_code_table_index BINARY_INTEGER; crlf CONSTANT VARCHAR(2) := CHR(13) || CHR(10); FUNCTION Next_Line_Number RETURN BINARY_INTEGER IS --============================================================================ -- NAME: Next_Line_Number -- PURPOSE: -- RETURNED VALUE: Binary Integer -- -- NOTES: -- -- MODIFICATION HISTORY -- PERSON DATE COMMENTS -- ---------- ---------- ------------------------------------------- -- Chet West 8/2/02 Initial creatiion --============================================================================ ------------------------------------------------------------------------------ --- TYPES, CURSORS, VARIABLES ------------------------------------------------------------------------------ BEGIN the_code_table_index := the_code_table_index + 1; RETURN the_code_table_index; -- EXCEPTION -- WHEN NO_DATA_FOUND THEN -- RAISE; -- WHEN OTHERS THEN -- RAISE; END Next_Line_Number; --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ PROCEDURE add_line (p_line_of_code IN t_line_of_code) IS --============================================================================ -- NAME: Add_Line -- PURPOSE: -- -- NOTES: -- -- MODIFICATION HISTORY -- PERSON DATE COMMENTS -- ---------- ---------- ------------------------------------------- -- Chet West 8/2/02 Initial creatiion --============================================================================ ------------------------------------------------------------------------------ --- TYPES, CURSORS, VARIABLES ------------------------------------------------------------------------------ BEGIN the_code_table(Next_Line_Number) := p_line_of_code; -- EXCEPTION -- WHEN NO_DATA_FOUND THEN -- RAISE; -- WHEN OTHERS THEN -- RAISE; END add_line; --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ PROCEDURE builder (p_schema_name IN VARCHAR2 ,p_pkg_name IN VARCHAR2 ,p_table_name IN VARCHAR2 DEFAULT NULL) IS --============================================================================ -- NAME: Builder -- PURPOSE: -- -- NOTES: -- -- MODIFICATION HISTORY -- PERSON DATE COMMENTS -- ---------- ---------- ------------------------------------------- -- Chet West 8/2/02 Initial creatiion -- Chet West 11/04/2005 Added a plsql table delete command at the -- beginning to iinitialize the table for reruns. --============================================================================ ------------------------------------------------------------------------------ --- TYPES, CURSORS, VARIABLES ------------------------------------------------------------------------------ CURSOR c_tabs IS SELECT t.table_name FROM ALL_TABLES t WHERE t.owner = p_schema_name AND t.table_name LIKE NVL(p_table_name||'%', t.table_name) AND t.table_name != 'CODE_TABLE' ORDER BY t.table_name; CURSOR c_cols (cp_table_name IN VARCHAR2) IS SELECT c.column_id, c.column_name FROM ALL_TAB_COLUMNS c WHERE c.owner = p_schema_name AND c.table_name = cp_table_name ORDER BY c.column_id; v_display_line VARCHAR2(4000); BEGIN -- --- Start the package spec and comment block -- the_code_table.delete; the_code_table_index := 0; add_line('CREATE OR REPLACE PACKAGE '||p_schema_name||'.'||p_pkg_name||' IS '); add_line('--==========================================================================='); add_line('-- NAME: '||p_pkg_name); add_line('-- PURPOSE: '); add_line('-- '); add_line('-- NOTES: '); add_line('-- '); add_line('-- MODIFICATION HISTORY '); add_line('-- PERSON DATE COMMENTS'); add_line('-- ---------- ---------- --------------------------------------------------'); add_line('-- '||RPAD(SUBSTR(USER,1,10),10,' ')||' '||RPAD(TO_CHAR(SYSDATE,'MM/DD/YYYY'),10,' ')||' Initial Creation'); add_line('--==========================================================================='); add_line('-----------------------------------------------------------------------------'); add_line('-- Public declarations of types, cursors, variables, exceptions'); add_line('-- procedures, and functions'); add_line('-----------------------------------------------------------------------------'); add_line(' '); -- --- Define types for each table -- <> FOR typ IN c_tabs LOOP add_line(' TYPE t_'||LOWER(typ.table_name)||' IS RECORD'); add_line(' ('); <> FOR typcol IN c_cols(typ.table_name) LOOP IF typcol.column_id = 1 THEN add_line(' '||LOWER(typcol.column_name)||' '||LOWER(typ.table_name)||'.'||LOWER(typcol.column_name)||'%TYPE'); ELSE add_line(' ,'||LOWER(typcol.column_name)||' '||LOWER(typ.table_name)||'.'||LOWER(typcol.column_name)||'%TYPE'); END IF; END LOOP TYPE_COLUMN_LOOP; add_line(' );'); add_line(' '); END LOOP type_loop; add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); -- --- Define basic initialize, insert, update, and delete --- procedures specifications for each table -- <> FOR spec IN c_tabs LOOP -- -- INIT -- add_line(' -------------------------------------'); add_line(' -- NAME : init_'||LOWER(spec.table_name)); add_line(' -- PURPOSE: Initialize a '||UPPER(spec.table_name)||' record.'); add_line(' -------------------------------------'); add_line(' PROCEDURE init_'||LOWER(spec.table_name)); add_line(' ('); add_line(' p_'||LOWER(spec.table_name)||' OUT '||'t_'||LOWER(spec.table_name)); add_line(' );'); add_line(' '); -- -- INS -- add_line(' -------------------------------------'); add_line(' -- NAME : ins_'||LOWER(spec.table_name)); add_line(' -- PURPOSE: Insert a '||UPPER(spec.table_name)||' record.'); add_line(' -------------------------------------'); add_line(' PROCEDURE ins_'||LOWER(spec.table_name)); add_line(' ('); add_line(' p_'||LOWER(spec.table_name)||' IN '||'t_'||LOWER(spec.table_name)); add_line(' );'); add_line(' '); -- -- UPD -- add_line(' -------------------------------------'); add_line(' -- NAME : upd_'||LOWER(spec.table_name)); add_line(' -- PURPOSE: Update a '||UPPER(spec.table_name)||' record.'); add_line(' -------------------------------------'); add_line(' PROCEDURE upd_'||LOWER(spec.table_name)); add_line(' ('); add_line(' p_'||LOWER(spec.table_name)||' IN '||'t_'||LOWER(spec.table_name)); add_line(' );'); add_line(' '); -- -- DEL -- add_line(' -------------------------------------'); add_line(' -- NAME : del_'||LOWER(spec.table_name)); add_line(' -- PURPOSE: Delete a '||UPPER(spec.table_name)||' record.'); add_line(' -------------------------------------'); add_line(' PROCEDURE del_'||LOWER(spec.table_name)); add_line(' ('); add_line(' p_'||LOWER(spec.table_name)||' IN '||'t_'||LOWER(spec.table_name)); add_line(' );'); add_line(' '); END LOOP spec_loop; -- --- Close out the package spec -- add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); add_line('END '||p_pkg_name||';'); add_line(' '); add_line('/'); -- --- Start the package body and comment block -- add_line('CREATE OR REPLACE PACKAGE BODY '||p_schema_name||'.'||p_pkg_name||' IS '); add_line('--==========================================================================='); add_line('-- NAME: '||p_pkg_name); add_line('--==========================================================================='); add_line('-----------------------------------------------------------------------------'); add_line('-- Private declarations of types, cursors, variables, exceptions'); add_line('-- procedures, and functions'); add_line('-----------------------------------------------------------------------------'); add_line(' '); -- --- Define basic initialize, insert, update and delete --- procedures bodies for each table -- <> FOR code IN c_tabs LOOP -- -- INIT -- add_line(' PROCEDURE init_'||LOWER(code.table_name)); add_line(' ('); add_line(' p_'||LOWER(code.table_name)||' OUT '||'t_'||LOWER(code.table_name)); add_line(' ) IS'); add_line(' --==========================================================================='); add_line(' -- NAME : init_'||LOWER(code.table_name)); add_line(' -- PURPOSE: Initialize a '||UPPER(code.table_name)||' record.'); add_line(' --'); add_line(' -- NOTES:'); add_line(' --'); add_line(' -- MODIFICATION HISTORY'); add_line(' -- PERSON DATE COMMENTS'); add_line(' -- ---------- ---------- --------------------------------------------------'); add_line(' -- '||RPAD(SUBSTR(USER,1,10),10,' ')||' '||RPAD(TO_CHAR(SYSDATE,'MM/DD/YYYY'),10,' ')||' Initial Creation'); add_line(' --==========================================================================='); add_line(' -----------------------------------------------------------------------------'); add_line(' --- TYPES, CURSORS, VARIABLES'); add_line(' -----------------------------------------------------------------------------'); add_line(' '); add_line(' BEGIN '); <> FOR initcol IN c_cols(code.table_name) LOOP add_line(' p_'||LOWER(code.table_name)||'.'||LOWER(initcol.column_name)||' := NULL;'); END LOOP INIT_COLUMN_LOOP; add_line(' END init_'||LOWER(code.table_name)||';'); add_line(' '); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); -- -- INS -- add_line(' PROCEDURE ins_'||LOWER(code.table_name)); add_line(' ('); add_line(' p_'||LOWER(code.table_name)||' IN '||'t_'||LOWER(code.table_name)); add_line(' ) IS'); add_line(' --==========================================================================='); add_line(' -- NAME : ins_'||LOWER(code.table_name)); add_line(' -- PURPOSE: Insert a '||UPPER(code.table_name)||' record.'); add_line(' --'); add_line(' -- NOTES:'); add_line(' --'); add_line(' -- MODIFICATION HISTORY'); add_line(' -- PERSON DATE COMMENTS'); add_line(' -- ---------- ---------- --------------------------------------------------'); add_line(' -- '||RPAD(SUBSTR(USER,1,10),10,' ')||' '||RPAD(TO_CHAR(SYSDATE,'MM/DD/YYYY'),10,' ')||' Initial Creation'); add_line(' --==========================================================================='); add_line(' -----------------------------------------------------------------------------'); add_line(' --- TYPES, CURSORS, VARIABLES'); add_line(' -----------------------------------------------------------------------------'); add_line(' '); add_line(' BEGIN '); add_line(' INSERT INTO '||UPPER(code.table_name)); add_line(' ('); <> FOR inscol1 IN c_cols(code.table_name) LOOP IF inscol1.column_id = 1 THEN add_line(' '||LOWER(inscol1.column_name)); ELSE add_line(' ,'||LOWER(inscol1.column_name)); END IF; END LOOP INS_COLUMN_LOOP1; add_line(' )'); add_line(' VALUES ('); <> FOR inscol2 IN c_cols(code.table_name) LOOP IF inscol2.column_id = 1 THEN add_line(' p_'||LOWER(code.table_name)||'.'||LOWER(inscol2.column_name)); ELSE add_line(' ,p_'||LOWER(code.table_name)||'.'||LOWER(inscol2.column_name)); END IF; END LOOP INS_COLUMN_LOOP2; add_line(' );'); add_line(' END ins_'||LOWER(code.table_name)||';'); add_line(' '); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); -- -- UPD -- add_line(' PROCEDURE upd_'||LOWER(code.table_name)); add_line(' ('); add_line(' p_'||LOWER(code.table_name)||' IN '||'t_'||LOWER(code.table_name)); add_line(' ) IS'); add_line(' --==========================================================================='); add_line(' -- NAME : upd_'||LOWER(code.table_name)); add_line(' -- PURPOSE: Update a '||UPPER(code.table_name)||' record.'); add_line(' --'); add_line(' -- NOTES:'); add_line(' --'); add_line(' -- MODIFICATION HISTORY'); add_line(' -- PERSON DATE COMMENTS'); add_line(' -- ---------- ---------- --------------------------------------------------'); add_line(' -- '||RPAD(SUBSTR(USER,1,10),10,' ')||' '||RPAD(TO_CHAR(SYSDATE,'MM/DD/YYYY'),10,' ')||' Initial Creation'); add_line(' --==========================================================================='); add_line(' -----------------------------------------------------------------------------'); add_line(' --- TYPES, CURSORS, VARIABLES'); add_line(' -----------------------------------------------------------------------------'); add_line(' '); add_line(' BEGIN '); add_line(' UPDATE '||UPPER(code.table_name)); add_line(' SET '); <> FOR updcol IN c_cols(code.table_name) LOOP IF UPDcol.column_id = 1 THEN add_line(' '||LOWER(updcol.column_name)||' = p_'||LOWER(code.table_name)||'.'||LOWER(updcol.column_name)); ELSE add_line(' ,'||LOWER(updcol.column_name)||' = p_'||LOWER(code.table_name)||'.'||LOWER(updcol.column_name)); END IF; END LOOP UPD_COLUMN_LOOP; add_line(' WHERE 1=1;'); add_line(' END upd_'||LOWER(code.table_name)||';'); add_line(' '); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); -- -- DEL -- add_line(' PROCEDURE del_'||LOWER(code.table_name)); add_line(' ('); add_line(' p_'||LOWER(code.table_name)||' IN '||'t_'||LOWER(code.table_name)); add_line(' ) IS'); add_line(' --==========================================================================='); add_line(' -- NAME : del_'||LOWER(code.table_name)); add_line(' -- PURPOSE: Delete a '||UPPER(code.table_name)||' record.'); add_line(' --'); add_line(' -- NOTES:'); add_line(' --'); add_line(' -- MODIFICATION HISTORY'); add_line(' -- PERSON DATE COMMENTS'); add_line(' -- ---------- ---------- --------------------------------------------------'); add_line(' -- '||RPAD(SUBSTR(USER,1,10),10,' ')||' '||RPAD(TO_CHAR(SYSDATE,'MM/DD/YYYY'),10,' ')||' Initial Creation'); add_line(' --==========================================================================='); add_line(' -----------------------------------------------------------------------------'); add_line(' --- TYPES, CURSORS, VARIABLES'); add_line(' -----------------------------------------------------------------------------'); add_line(' '); add_line(' BEGIN '); add_line(' DELETE FROM '||UPPER(code.table_name)); add_line(' WHERE 1=1;'); add_line(' END del_'||LOWER(code.table_name)||';'); add_line(' '); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); END LOOP code_loop; -- --- Close out the package body -- add_line('BEGIN'); add_line(' -------------------------------------'); add_line(' -- * Package Initialization Code * --'); add_line(' -------------------------------------'); add_line(' NULL;'); add_line('END '||p_pkg_name||';'); add_line(' '); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line('--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__'); add_line(' '); add_line('/'); <> FOR idx IN the_code_table.FIRST..the_code_table.LAST LOOP INSERT INTO CODE_TABLE (line_number, line_of_code) VALUES (idx, the_code_table(idx)); END LOOP output_loop; -- EXCEPTION -- WHEN NO_DATA_FOUND THEN -- RAISE; -- WHEN OTHERS THEN -- RAISE; END builder; --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ --__--__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__ BEGIN ------------------------------------- -- * Package Initialization Code * -- ------------------------------------- NULL; END CODE_GENERATOR; /