Regarding, the cross join. you may get the result you want, but it will be doing needless joining of records. You should look up and understand what a cross join does, if you don't already know. If each of your tables has 1,000 records, then internally you are creating 1,000 X 1,000 rows/records. 1,000,000 is a lot of rows. There is no need to join those two tables, so you should probably break it into two independent SELECT statements.
As for the dynamic SQL part (the cursor), can you show me what you did? Thanks, Mike On Tue, Apr 24, 2012 at 11:47 AM, xX_VP_Xx <dustinjwoodr...@gmail.com>wrote: > Hi Mike, > > Thanks for your reply. The cross join works fine but I am not quite sure > how to implement the first part you suggested. When I try to use what you > posted I get an error stating that mystr is not a cursor. I seem to be > having an immense amount of trouble understanding this. Once again thanks > for the help. > > DECLARE > mystr VARCHAR2 (2000) := 'SELECT * FROM ' || yourtableparameter; > BEGIN > FOR cur1 IN mystr > LOOP > NULL; > END LOOP; > END; > > > > 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):= >> '**84346135c711cc270809193d47c522**030e39963'; >> --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 > -- 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