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

Reply via email to