I am still not quite sure how I managed to get this to work. I started learning as I wrote this. I will definitely change the cross join to 2 separate selects as I just need the highest id number. This is what I did for the cursor, and looking at it I can see that I totally removed my cursor (import_check) and am lost as to how to implement your suggestion into the cursor.
create or replace PROCEDURE PHYS_IMPORT( VAR_FACILITY IN NUMBER, TABLE_NAME IN VARCHAR2) AS var_rows NUMBER :=0; var_fac_id NUMBER := var_facility; --Facility ID we are working with. var_code NUMBER (10); --Code to be inserted eg:4011104 (facility code + dict_id). var_password VARCHAR2 (40):= '84346135c711cc270809193d47c522030e39963'; --unsalted SHA1HASH var_dept VARCHAR2 (32); --Dept from import table. var_note VARCHAR2 (255); --Note from import table. var_esig VARCHAR2 (255) := 0; --Esig from import table. var_title_id VARCHAR2 (255); --ID from physcician_titles table. var_specialty_id VARCHAR2 (255); --ID from specialty table. max_title_id physician_title.id%TYPE; --Current highest ID in physcician_titles table. max_specialty_id specialty.id%TYPE; --Current highest ID in specialty table. var_num_errors NUMBER (5) := 0; --Number of errors found in import table. var_inc_titles NUMBER (5) := 0; --Used to increment ID of Titles var_inc_spec NUMBER := 0; --Used to increment ID of Specialties. var_user_initials VARCHAR(5); --User initials (To be inserted into ALTEMPUSER table). var_uname VARCHAR2(255); --Username (To be inserted into ALTEMPUSER table). var_first_initial VARCHAR2(255); --First name initial. var_middle_initial VARCHAR2(255); --Middle name initial. var_last_initial VARCHAR (1); --Last name initial. var_last_full VARCHAR2(255); --Full last name. mystr VARCHAR2 (2000) := 'SELECT i.rowid, i.* FROM ' || table_name 'i'; -- CURSOR import_check -- IS --SELECT i.ROWID, i.* FROM [supply when run] i; BEGIN FOR rw IN mystr LOOP On Tuesday, April 24, 2012 11:55:05 AM UTC-4, xX_VP_Xx wrote: > > Hello, I am an absolute beginner to PLSQL and need some assistance. > > I would like to be able to supply a table name when I run my stored > procedure. From what I gather I have to use dynamic SQl to do this. This > stored procedure works as intended when I omit the table_name parameter. I > am also looking for another set of eyes to see if I can improve this at > all. I appreciate any help anyone has to offer as I am still learning. > > *This is what I would like to use to run it:* > SET SERVEROUTPUT ON > BEGIN > PHYS_IMPORT(99999,[Table_name]); > END; > > > > *This is the stored procedure:* > > create or replace > PROCEDURE PHYS_IMPORT( > VAR_FACILITY IN NUMBER, TABLE_NAME IN VARCHAR2) > AS > var_rows NUMBER :=0; > var_fac_id NUMBER := var_facility; > --Facility ID we are working with. > var_code NUMBER (10); > --Code to be inserted eg:4011104 (facility code + dict_id). > var_password VARCHAR2 (40):= > '84346135c711cc270809193d47c522030e39963'; --unsalted SHA1HASH > var_dept VARCHAR2 (32); > --Dept from import table. > var_note VARCHAR2 (255); > --Note from import table. > var_esig VARCHAR2 (255) := 0; > --Esig from import table. > var_title_id VARCHAR2 (255); > --ID from physcician_titles table. > var_specialty_id VARCHAR2 (255); > --ID from specialty table. > max_title_id physician_title.id%TYPE; > --Current highest ID in physcician_titles table. > max_specialty_id specialty.id%TYPE; > --Current highest ID in specialty table. > var_num_errors NUMBER (5) := 0; > --Number of errors found in import table. > var_inc_titles NUMBER (5) := 0; > --Used to increment ID of Titles > var_inc_spec NUMBER := 0; > --Used to increment ID of Specialties. > var_user_initials VARCHAR(5); > --User initials (To be inserted into ALTEMPUSER table). > var_uname VARCHAR2(255); > --Username (To be inserted into ALTEMPUSER table). > var_first_initial VARCHAR2(255); > --First name initial. > var_middle_initial VARCHAR2(255); > --Middle name initial. > var_last_initial VARCHAR (1); > --Last name initial. > var_last_full VARCHAR2(255); > --Full last name. > /* Loop through to check each physician to be imported from the [supply > when run] table. */ > CURSOR import_check > IS > SELECT i.ROWID, i.* FROM [supply when run] i; > > BEGIN > > /* Get current highest Title_ID and Specialty_ID*/ > SELECT MAX(t.id), > MAX(s.id) > INTO max_title_id, > max_specialty_id > FROM physician_title t, > specialty s ; > > > FOR rw IN import_check > LOOP > IF Regexp_like(rw.first, '^[[:alnum:][:punct:] ]{1,32}$') THEN > NULL; --dbms_output.Put_line('FIRST: '|| rw.first|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'FIRST Must be alpha numeric and between 1-32 > characters.' > WHERE rowid =rw.rowid; > CONTINUE; > /* Next loop iteration */ > END IF; > IF Regexp_like(rw.last, '^[[:alnum:][:punct:] ]{1,32}$') THEN > NULL; --dbms_output.Put_line('LAST: '|| rw.last|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'Last Must be alpha numeric and between 1-32 > characters.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF rw.middle IS NULL OR Regexp_like(rw.middle, '^[[:alpha:]]{0,1}$') > THEN > NULL; --dbms_output.Put_line('MIDDLE: '|| rw.middle|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'MIDDLE Must be a single alpha charachter.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF rw.dict_id IS NULL OR Regexp_like(rw.dict_id, '^\d{1,16}$') THEN > NULL; -- dbms_output.Put_line('DICT_ID: '|| rw.dict_id|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'DICT_ID Can only contain Digits from 0-9. With > a maximum of 16 digits.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF Regexp_like(rw.ext_code, '^[[:alnum:][:punct:] ]{0,16}$') THEN > NULL; --dbms_output.Put_line('EXT_CODE: '|| rw.ext_code|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'EXT_CODE Must be alpha numeric and between 1-16 > characters.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF var_note IS NULL OR Regexp_like(rw.note, '^.{0,255}$') THEN > NULL; --dbms_output.Put_line('NOTE:(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'NOTE can only be max 255 characters.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF rw.co_signer IS NULL OR Regexp_like(rw.co_signer, '^[10]{1}$') THEN > rw.co_signer :=0; > NULL; --dbms_output.Put_line('CO_SIGNER: '|| rw.co_signer|| '(OK)'); > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'CO_SIGNER Can only contain 1 or 0.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF rw.title IS NULL OR Regexp_like(rw.title, '^.{1,32}$') THEN > NULL; > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'TITLE Can only contain max 32 chars.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > IF var_dept IS NULL OR Regexp_like(rw.dept, '^[ [:alpha:]]{1,32}$') > THEN > NULL; > ELSE > var_num_errors := var_num_errors + 1; --used to count errors > UPDATE "APEX_DBO"."[supply when run]" > SET ERROR_MESSAGE = 'DEPT Must be alpha numeric and between 1-32 > characters.' > WHERE rowid =rw.rowid; > CONTINUE; > END IF; > var_first_initial := Regexp_replace (rw.first, '[^[:alpha:]]'); > var_middle_initial := Regexp_replace (rw.middle, '[^[:alpha:]]'); > var_last_full := Regexp_replace (rw.last, '[^[[:alpha:]]', ''); > var_first_initial := SUBSTR(Lower(var_first_initial), 1, 1); > var_middle_initial := SUBSTR(Lower(var_middle_initial), 1, 1); > var_last_full := SUBSTR(Lower(var_last_full),1,10); > var_last_initial := SUBSTR(Lower(var_last_full), 1, 1); > var_uname := var_first_initial ||var_last_full; > var_user_initials := var_first_initial ||var_middle_initial > ||var_last_initial; > var_user_initials := Upper(var_user_initials); > BEGIN > IF Regexp_replace (rw.title, '[^[:alnum:]]') IS NULL THEN > rw.title :=' '; > END IF; > SELECT id > INTO var_title_id > FROM physician_title > WHERE NAME = rw.title; > EXCEPTION > WHEN no_data_found THEN > var_inc_titles := var_inc_titles + 1; --used to count titles for > summary > dbms_output.Put_line('New title: ' || rw.title); > max_title_id := max_title_id + 1; --Add 1 to highest title ID > dbms_output.Put_line('Inserting new title: ID: ' || max_title_id ||' > Title: ' ||rw.title); > dbms_output.Put_line('INSERT INTO physician_title (ID,NAME) VALUES > (' ||max_title_id ||',' ||' ' || rw.title || ');'); > var_title_id := max_title_id; > INSERT > INTO physician_title > ( > ID, > NAME > ) > VALUES > ( > CAST (max_title_id AS NUMBER(10,0)), > CAST(rw.title AS VARCHAR2(32)) > ); --Insert new titles > END; > BEGIN > IF Regexp_replace (rw.dept, '[^[:alnum:]]') IS NULL THEN > rw.dept :='Unknown'; > END IF; > SELECT id INTO var_specialty_id FROM specialty WHERE NAME = rw.dept; > EXCEPTION > WHEN no_data_found THEN > var_inc_spec := var_inc_spec + 1; --used to count specialties for > summary > dbms_output.Put_line('New specialty found: ' || rw.dept); > max_specialty_id := max_specialty_id + 1; --Add 1 to highest > specialty ID. > dbms_output.Put_line('Inserting new specialty: ID:' || > max_specialty_id ||' Title: ' ||rw.dept); > dbms_output.Put_line('INSERT INTO specialty (ID,NAME) VALUES (' > ||max_specialty_id ||',' ||' ' || rw.dept || ');'); > var_specialty_id := max_specialty_id; > INSERT > INTO specialty > ( > ID, > NAME > ) > VALUES > ( > CAST (max_specialty_id AS NUMBER(10,0)), > CAST(rw.dept AS VARCHAR2(32)) > ); --Insert new specialties > END; > BEGIN > SELECT code > INTO var_code > FROM facility > WHERE facility_id = var_fac_id; > var_code := var_code ||rw.dict_id; > END; > var_rows := var_rows + 1; > INSERT > INTO phys_import_temp > ( > user_name, > last_name, > first_name, > middle_initial, > dict_id, > ext_code, > code, > title_id, > esig, > password, > initials, > specialty, > facility_id, > co_signer, > note > ) > VALUES > ( > CAST (var_uname AS VARCHAR2(32)), > CAST (rw.last AS VARCHAR2(32)), > CAST (rw.first AS VARCHAR2(32)), > CAST (rw.middle AS VARCHAR2(1)), > CAST (rw.dict_id AS NUMBER(10,0)), > CAST (rw.ext_code AS VARCHAR2(16)), > CAST (var_code AS VARCHAR2(16)), > CAST (var_title_id AS NUMBER(10,0)), > CAST (var_esig AS NUMBER(1,0)), > CAST (var_password AS VARCHAR2(40)), > CAST (var_user_initials AS VARCHAR2(4)), > CAST (var_specialty_id AS NUMBER(10,0)), > CAST (var_fac_id AS NUMBER(10,0)), > CAST (rw.co_signer AS NUMBER(1,0)), > CAST (rw.note AS VARCHAR2(512)) > ); > > COMMIT; > END LOOP; > dbms_output.Put_line('------------------------------'); > dbms_output.Put_line('Operation Complete.'); > dbms_output.Put_line('------------------------------'); > dbms_output.Put_line('Entries Processed: '|| var_rows); > dbms_output.Put_line('There were ' || var_num_errors || ' errors.' ); > dbms_output.Put_line('There were ' || var_inc_titles || ' New Titles.' ); > dbms_output.Put_line('There were ' || var_inc_spec || ' New > Specialties.' ); > dbms_output.Put_line('------------------------------'); > END PHYS_IMPORT; > -- You received this message because you are subscribed to the Google Groups "Oracle PL/SQL" group. To post to this group, send email to Oracle-PLSQL@googlegroups.com To unsubscribe from this group, send email to oracle-plsql-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Oracle-PLSQL?hl=en