Oracle Web Application Programming for PL/SQL Developers

Solutions Instruct Package

Description: The Instructor package was complete with the following elements:

Package Header for Instruct

 CREATE OR REPLACE 
 PACKAGE         INSTRUCT
  AS
  ---------------------------------------------------------------
      -- FILE : instruct_header.sql
      -- CREATED BY : Ben Rosenzweig
      -- CREATED BY DATE: January 12, 2003
  ---------------------------------------------------------------
    V_FONT  VARCHAR2(150);
    CURSOR  c_instruct_list IS
    SELECT  first_name, last_name, instructor_id
      FROM  instructor;
    TYPE Inst_Tbl_Type IS TABLE OF c_instruct_list%ROWTYPE
         INDEX BY BINARY_INTEGER;
    Instruct_Table           inst_tbl_type;
     i                NUMBER := 1;
	 
  
    PROCEDURE grade_calc
              (P_student_id   IN student.student_id%type,
               p_section_id   IN section.section_id%TYPE,
               p_final_grade  OUT enrollment.final_grade%TYPE,
               p_exit_code    OUT CHAR);


    PROCEDURE instruct_personal_info
      (p_instructor_id IN instructor.instructor_id%TYPE);

    PROCEDURE instructor_list_info;
	
    PROCEDURE showzip
      (p_zip IN instructor.zip%TYPE DEFAULT '10019');

    PROCEDURE instructors_frame;

    PROCEDURE instructors_left_nav;

    PROCEDURE update_instructor
      (p_instructor_id  IN instructor.instructor_id%TYPE,
	   p_salutation     IN instructor.salutation%TYPE,
	   p_first_name     IN instructor.first_name%TYPE,
	   p_last_name      IN instructor.last_name%TYPE,
	   p_street_address IN instructor.street_address%TYPE,
	   p_zip            IN instructor.zip%TYPE,
	   p_phone          IN instructor.phone%TYPE);

    PROCEDURE instructor_list_class;

    PROCEDURE instruct_classes
      (p_instructor_id IN instructor.instructor_id%TYPE);

    PROCEDURE student_list
      (p_section_id IN section.section_id%TYPE DEFAULT 87);


END INSTRUCT;

Package Body for Instruct

CREATE OR REPLACE 
PACKAGE BODY         INSTRUCT AS
---------------------------------------------------------------
-- FILE : instruct_body.sql
-- CREATED BY : Ben Rosenzweig
-- CREATED BY DATE: January 12, 2003
---------------------------------------------------------------

---------------------------------------------------------------
-- NAME : grade_calc
-- CREATED BY : Ben Rosenzweig
-- DESCRIPTION: Calculates the final grade for the student and
--              section passed in.
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.grade_calc
---------------------------------------------------------------
    PROCEDURE grade_calc
       (P_student_id   IN student.student_id%type,
        P_section_id   IN section.section_id%TYPE,
        P_final_grade  OUT enrollment.final_grade%TYPE,
        P_exit_code    OUT CHAR)
    AS
      v_student_id             student.student_id%TYPE;
      v_section_id             section.section_id%TYPE;
      v_grade_type_code        grade_type_weight.grade_type_code%TYPE;
      v_grade_percent          NUMBER;
      v_final_grade            NUMBER;
      v_grade_count            NUMBER;
      v_lowest_grade           NUMBER;
      v_exit_code              CHAR(1) := 'S';
    --  Next two variables are used to calculate whether a cursor
    --  has no result set.
      v_no_rows1               CHAR(1) := 'N';
      v_no_rows2               CHAR(1) := 'N';
      e_no_grade               EXCEPTION;
    -- Cursor to loop through all grade types for a given section.
      CURSOR  c_grade_type
              (pc_section_id  section.section_id%TYPE)
              IS
       SELECT GRADE_TYPE_CODE,
              NUMBER_PER_SECTION,
              PERCENT_OF_FINAL_GRADE,
              NVL(DROP_LOWEST, 'N') DROP_LOWEST
        FROM  grade_Type_weight
       WHERE  section_id = pc_section_id
         AND section_id IN (SELECT section_id
                              FROM grade 
                             WHERE student_id = p_student_id);
    -- Cursor to loop through all grades for a given student
    -- in a given section.
     CURSOR  c_grades
              (p_grade_type_code
                   grade_Type_weight.grade_type_code%TYPE,
               pc_student_id  student.student_id%TYPE,
               pc_section_id  section.section_id%TYPE) IS
       SELECT grade_type_code,grade_code_occurrence,
              numeric_grade
       FROM   grade
       WHERE  student_id = pc_student_id
       AND    section_id = pc_section_id
       AND    grade_type_code = p_grade_type_code;
    BEGIN
    v_section_id := p_section_id;
    v_student_id := p_student_id;
    -- Start loop of grade types for the section.
       FOR r_grade in c_grade_type(v_section_id)
       LOOP
    -- Since cursor is open it has a result
    -- set, change indicator.
           v_no_rows1 := 'Y';
    -- To hold the number of grades per section,
    -- reset to 0 before detailed cursor loops
           v_grade_count := 0;
           v_grade_type_code := r_grade.GRADE_TYPE_CODE;
    -- Variable to hold the lowest grade.
    -- 500 will not be the lowest grade.
           v_lowest_grade := 500;
    -- Determine what to multiply a grade by to
    -- compute final grade, must take into consideration
    -- if the drop lowest grade indicator is Y
           SELECT (r_grade.percent_of_final_grade /
                   DECODE(r_grade.drop_lowest, 'Y',
                                (r_grade.number_per_section - 1),
                                 r_grade.number_per_section
                         ))* 0.01
            INTO  v_grade_percent
            FROM dual;
    -- Open cursor of detailed grade for a student in a
    -- given section.
           FOR r_detail in c_grades(v_grade_type_code,
                             v_student_id, v_section_id) LOOP
        -- Since cursor is open it has a result
        -- set, change indicator.
               v_no_rows2 := 'Y';
               v_grade_count  := v_grade_count + 1;
        -- Handle the situation where there are more
        -- entries for grades of a given grade type
        -- than there should be for that section.
               If v_grade_count > r_grade.number_per_section THEN
                  v_exit_code := 'T';
                  raise e_no_grade;
               END IF;
        -- If drop lowest flag is Y determine which is lowest
       -- grade to drop
               IF  r_grade.drop_lowest = 'Y' THEN
                    IF nvl(v_lowest_grade, 0) >=
                           r_detail.numeric_grade
                 THEN
                        v_lowest_grade := r_detail.numeric_grade;
                    END IF;
               END IF;
        -- Increment the final grade with percentage of current
        -- grade in the detail loop.
               v_final_grade := nvl(v_final_grade, 0) +
                      (r_detail.numeric_grade * v_grade_percent);
          END LOOP;
       -- Once detailed loop is finished, if the number of grades
       -- for a given student for a given grade type and section
       -- is less than the required amount, raise an exception.
              IF  v_grade_count < r_grade.NUMBER_PER_SECTION THEN
                  v_exit_code := 'I';
                  raise e_no_grade;
              END IF;
       -- If the drop lowest flag was Y then you need to take
       -- the lowest grade out of the final grade, it was not
       -- known when it was added which was the lowest grade
       -- to drop until all grades were examined.
              IF  r_grade.drop_lowest = 'Y' THEN
                  v_final_grade := nvl(v_final_grade, 0) -
                            (v_lowest_grade *  v_grade_percent);
              END IF;
      END LOOP;
   -- If either cursor had no rows then there is an error.
   IF v_no_rows1 = 'N' OR v_no_rows2 = 'N'   THEN
       v_exit_code := 'N';
       raise e_no_grade;
   END IF;
   P_final_grade  := v_final_grade;
   P_exit_code    := v_exit_code;
   EXCEPTION
     WHEN e_no_grade THEN
       P_final_grade := null;
       P_exit_code   := v_exit_code;
     WHEN OTHERS THEN
       P_final_grade := null;
       P_exit_code   := 'E';
 END grade_calc;

---------------------------------------------------------------
-- NAME : instruct_personal_info
-- CREATED BY : Sol Morse, Susan Boardman
-- DESCRIPTION: Form to collect instructor personal information
--              for the instructor id passed in.
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instruct_personal_info
---------------------------------------------------------------
PROCEDURE instruct_personal_info
   (p_instructor_id IN instructor.instructor_id%TYPE) 
 AS
   v_instructor_id   instructor.instructor_id%TYPE;
   v_salutation      instructor.salutation%TYPE;
   v_first_name      instructor.first_name%TYPE;
   v_last_name       instructor.last_name%TYPE;
   v_street_address  instructor.street_address%TYPE;
   v_city            zipcode.city%TYPE;
   v_state           zipcode.state%TYPE;
   v_zip             instructor.zip%TYPE;
   v_phone           instructor.phone%TYPE;
   BEGIN
      SELECT instructor_id, 
	         salutation, 
			 first_name, 
             last_name, 
			 street_address, 
			 city, 
			 state, 
			 i.zip, 
			 phone
	  INTO   v_instructor_id, 
			 v_salutation, 
			 v_first_name, 
			 v_last_name, 
			 v_street_address, 
			 v_city,
			 v_state,
			 v_zip, 
			 v_phone
	FROM instructor i, zipcode z
   WHERE i.zip = z.zip
     AND instructor_id = p_instructor_id;
	 
	 htp.p('<HTML>');
	 htp.p('<HEAD>');
	 htp.p('<TITLE>Instructor Personal Info</TITLE>');
	 htp.p('</HEAD>');
	 htp.p('<BODY bgColor="#99CCCC">');
	 htp.p('<CENTER>');
																 
	 htp.p('<H1>Personal Info For '||v_first_name||' '||v_last_name||'</H1>');
	 htp.p('<H2>This Is The Current Information On Record.</H2>');
	 htp.p('<H3>To Make Changes, Edit The Information And Select ''Save''.</H3>');
	 htp.p('<FORM ACTION="instruct.update_instructor" METHOD="get" NAME="instructor_personal_form">');
	 htp.p('<INPUT TYPE="hidden" NAME="p_instructor_id" VALUE="'||v_instructor_id||'">');
	 htp.p('<TABLE >');
	 htp.p('<TR>');
	 htp.p('<TD>Salutation:</TD>');
	 htp.p('<TD><INPUT TYPE="text" NAME="p_salutation" VALUE="'||v_salutation||'" SIZE="5"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>First Name:</TD>');
	 htp.p('<TD><INPUT TYPE="text" NAME="p_first_name" VALUE="'||v_first_name||'" SIZE="25"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>Last Name:</TD>');
	 htp.p('<TD><INPUT TYPE="text" NAME="p_last_name" VALUE="'||v_last_name||'" 	 	 SIZE="25"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>Street Address:</TD>');
	 htp.p('<TD><INPUT TYPE="text" NAME="p_street_address" VALUE="'||v_street_address||'"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>City:</TD>');
	 htp.p('<TD>'||v_city||'</TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>State:</TD>');
	 htp.p('<TD>'||v_state||'</TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>Zipcode:</TD>');
	 htp.p('<TD><INPUT TYPE="text" NAME="p_zip" VALUE="'||v_zip||'"></TD>');
	 htp.p('<TD><INPUT TYPE="button" VALUE="Change Zipcode"              onClick="javascript:window.open(''instruct.showzip?p_zip=''+document.instructor_personal_form.p_zip.value, ''instructor_zip'', ''TOOLBAR=NO, STATUS=yes, MENUBAR=no, SCROLLBARS=auto, RESIZABLE=yes, WIDTH=640, HEIGHT=480'');"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD>Telephone:</TD>');
	 htp.p('<TD><INPUT TYPE="text" VALUE="'||v_phone||'" NAME="p_phone" MAXLENGTH="15" SIZE="15"></TD>');
	 htp.p('</TR>');
	 htp.p('<TR>');
	 htp.p('<TD></TD>');
	 htp.p('<TD ALIGN=left>');
	 htp.p('<INPUT TYPE="submit" VALUE="SUBMIT">');
	 htp.p('<INPUT TYPE="reset" VALUE="RESET">');
	 htp.p('</TD>');
	 htp.p('</TR>');
	 htp.p('</TABLE>');
	 htp.p('</FORM>');
	 htp.p('</CENTER>');
	 htp.p('</BODY>');
	 htp.p('</HTML>');

  EXCEPTION
     WHEN OTHERS THEN
        htp.p('An error occurred: '||SQLERRM||'. Please try again later.');
  END instruct_personal_info;


---------------------------------------------------------------
-- NAME : instructor_list_info
-- CREATED BY : Susan Boardman
-- DESCRIPTION: List of hyperlinked instructor names
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instructor_list_info
---------------------------------------------------------------
PROCEDURE instructor_list_info
IS
    CURSOR get_instructor IS
	       SELECT first_name, last_name, instructor_id
		   FROM instructor
		   ORDER BY last_name, first_name;
  BEGIN
     htp.p('<HTML>');
	 htp.p('<HEAD>');
	 htp.p('<TITLE>Instructor Maintenance Web Site</TITLE>');
	 htp.p('</HEAD>');
	 htp.p('<BODY BgColor="#99CCCC">');
	 htp.p('<CENTER>');
	 htp.p('<H2>List of Instructors</H2>');
	 htp.p('<TABLE ALIGN="center" BORDER="3" BORDERCOLOR="midnight blue"
	         CELLPADDING="5" WIDTH="100%">');
	 htp.p('<TR>');
	 htp.p('<TH ALIGN="center">Instructor Names</TH>');
	 htp.p('</TR>');
      FOR rec IN get_instructor
        LOOP
        htp.p('<TR>');
        htp.p('<TD><FONT FACE="Arial">
        <A HREF="instruct.instruct_personal_info?p_instructor_id='
        ||rec.instructor_id||'">'
        ||rec.last_name||','||rec.first_name||'</A></FONT></TD>');
        htp.p('</TR>');
        END LOOP;
        
        htp.p('</TABLE>');
        htp.p('</CENTER>');
        htp.p('</BODY>');
  EXCEPTION
    WHEN OTHERS THEN
        htp.p('An error occurred: '||SQLERRM||'. Please try again later.');
  END instructor_list_info;


---------------------------------------------------------------
-- NAME : showzip
-- CREATED BY : Sol Morse, Susan Boardman
-- DESCRIPTION: List of hyperlinked instructor names
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.showzip
---------------------------------------------------------------
PROCEDURE showzip
      (p_zip IN instructor.zip%TYPE DEFAULT '10019')
   IS 
        CURSOR c_zip IS 
		   SELECT city, state, zip 
		     FROM zipcode 
	     ORDER BY state, city, zip; 
  BEGIN 
    htp.htmlOpen;
	htp.headOpen;
	htp.title('Instructor Zipcode');
	htp.script('
	     <!--Begin hiding javascript contents from old browsers.
		 function chooseZip() {
		 window.opener.instructor_personal_form.p_zip.value=document.zipcode_form.p_new_zip.value;
		 window.close();
		      }
	    //End the hiding here-->', 'JavaScript');
	htp.headClose;
	htp.bodyOpen(cattributes => 'BGCOLOR="#99CCCC"');
	htp.centerOpen;
	htp.p('<FORM NAME="zipcode_form" ACTION="" METHOD="post">');
	
	htp.p('<SELECT NAME="p_new_zip" SIZE="15">');
	
	FOR rec IN c_zip
	  LOOP
	     IF rec.zip = p_zip THEN
		    htp.p('<OPTION VALUE="'||rec.zip||'" SELECTED>'
			    ||rec.city||', '||rec.state||'  '||rec.zip||
				'</OPTION>');
		 ELSE
		    htp.p('<OPTION VALUE="'||rec.zip||'">'
			    ||rec.city||', '||rec.state||'  '||rec.zip||
				'</OPTION>');
		 END IF;
	END LOOP;
	  
	htp.p('</SELECT>');
	htp.p('<BR>');
	htp.p('<BR>');
	  
	htp.p('<INPUT TYPE="button" VALUE="Select Zipcode" onClick="chooseZip();">');
	htp.p('<INPUT TYPE="button" VALUE="Cancel" onClick="window.close();">');
	htp.formClose;
	htp.centerClose;
	htp.bodyClose;
	htp.htmlClose;
	
	EXCEPTION
	   WHEN OTHERS THEN 
	      htp.p('An error occurred:  '||SQLERRM||'.  Please try again later.');
  END showzip;



---------------------------------------------------------------
-- NAME : instructors_frame
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Creates frameset for instructor-related pages
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instructors_frame
---------------------------------------------------------------
PROCEDURE instructors_frame  AS 
    BEGIN
	  htp.htmlOpen;
	  htp.headOpen;
	  htp.title('Instructors Frame');
	  htp.headClose;
	  
	  htp.framesetOpen(NULL,'150,*');
	  htp.frame('instruct.instructors_left_nav','instructors_left',null,null,null,'Y');
	  htp.frame('instruct.instructor_list_info','instructors_main',null,null,'AUTO');
	  
	  htp.noframesOpen;
	  htp.p('<BODY>
	    <P>This page uses frames, but your browser doesn''t support them.</P>
		</BODY>');
	  htp.noframesClose;
	  
	  htp.framesetClose;
	  htp.htmlClose;
   END instructors_frame;



---------------------------------------------------------------
-- NAME : instructors_left_nav
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Paints left nav menus for instructor-related pages
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instructors_left_nav
---------------------------------------------------------------
PROCEDURE instructors_left_nav
     AS
  BEGIN
    htp.p('
	 <HTML>
		<HEAD>
		  <TITLE>Instructors Left Nav</TITLE>
		</HEAD>
		<BODY BGCOLOR="#99CCCC">
		  
		  <TABLE BORDER="0" WIDTH="100%">
		    <TR>
		      <TD ALIGN="center">
		        <A HREF="instruct.instructor_list_info" TARGET="instructors_main">
		        <FONT FACE="Arial"><SMALL>Edit Instructor</SMALL></FONT>
                </A>
  		      </TD>
		    </TR>
		    <TR>
		      <TD ALIGN="center">
		        <A HREF="instruct.instructor_list_class" TARGET="instructors_main">
  		        <FONT FACE="Arial"><SMALL>View Classes</SMALL></FONT>
                </A>
		      </TD>
		    </TR>
		  </TABLE>
		  
		</BODY>
	 </HTML>
      ');
   END instructors_left_nav;


---------------------------------------------------------------
-- NAME : update_instructor
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Updates instructor record with information
--              collected in instruct.instruct_personal_info
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.update_instructor
---------------------------------------------------------------
PROCEDURE update_instructor
    (p_instructor_id  IN instructor.instructor_id%TYPE,
	 p_salutation     IN instructor.salutation%TYPE,
	 p_first_name     IN instructor.first_name%TYPE,
	 p_last_name      IN instructor.last_name%TYPE,
	 p_street_address IN instructor.street_address%TYPE,
	 p_zip            IN instructor.zip%TYPE,
	 p_phone          IN instructor.phone%TYPE)
	 
      IS
 BEGIN 
    UPDATE instructor 
	   SET salutation = p_salutation, 
	       first_name = p_first_name, 
		   last_name = p_last_name, 
		   street_address = p_street_address, 
		   zip = p_zip, 
		   phone = p_phone 
   	 WHERE instructor_id = p_instructor_id; 
	COMMIT;

	 htp.p('<HTML> 
      <HEAD><TITLE>Update Instructor Personal Info</TITLE></HEAD> 
      <BODY>'); 
	    htp.script('alert("The new information for this instructor has been saved successfully!");', 'JavaScript'); 
	 htp.p('</BODY></HTML>'); 
      
	 instruct.instruct_personal_info(p_instructor_id);
	  
     htp.script('document.write("<H3><CENTER><FONT COLOR=RED>The new information for this instructor has been successfully saved!</FONT></CENTER></H3>");', 
        'JavaScript');

 EXCEPTION
        WHEN OTHERS THEN
          htp.p('An error occurred: '||SQLERRM||'. Please try again later.');
 END update_instructor;


---------------------------------------------------------------
-- NAME : instructor_list_class
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Hyperlinked list of instructors
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instructor_list_class
---------------------------------------------------------------
PROCEDURE instructor_list_class
   IS
     CURSOR get_instructor IS
        SELECT first_name, last_name, instructor_id
	      FROM instructor
	  ORDER BY last_name, first_name;
  BEGIN
     htp.p('<HTML>');
	 htp.p('<HEAD>');
	 htp.p('<TITLE>Instructor Maintenance Web Site</TITLE>');
	 htp.p('</HEAD>');
	 htp.p('<BODY BgColor="#99CCCC">');
	   htp.p('<CENTER>');
	   htp.p('<H2>List of Instructors</H2>');
	   htp.p('<TABLE ALIGN="center" BORDER="3" BORDERCOLOR="midnight blue"
	           CELLPADDING="5" WIDTH="100%">');
	      htp.p('<TR>');
	          htp.p('<TH ALIGN="center">Instructor Names</TH>');
     	  htp.p('</TR>');
	 
	      FOR rec IN get_instructor
	      LOOP
	         htp.p('<TR>');
	         htp.p('<TD><FONT FACE="Arial">
	                <A HREF="instruct.instruct_classes?p_instructor_id='
	                ||rec.instructor_id||'">' 
	                ||rec.last_name||','||rec.first_name||'</A></FONT></TD>');
	         htp.p('</TR>');
	      END LOOP;
	  
	    htp.p('</TABLE>');
	    htp.p('</CENTER>');
	  htp.p('</BODY>');
	  htp.p('</HTML>');
  EXCEPTION
   WHEN OTHERS THEN
	  htp.p('An error occurred in instructor_list_class:  '
             ||SQLERRM||'.  Please try again later.');
  END instructor_list_class;


---------------------------------------------------------------
-- NAME : instruct_classes
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Lists classes taught by instructor passed in.
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.instruct_classes
---------------------------------------------------------------
PROCEDURE instruct_classes
  (p_instructor_id IN instructor.instructor_id%TYPE)
  IS
     v_instructor_name VARCHAR2(60);
     v_count           INTEGER := 0;
  
     CURSOR c_courses IS
        SELECT s.course_no, description, section_id,
               TO_CHAR(start_date_time, 'DD-MON-YY') start_date,
               TO_CHAR(start_date_time, 'HH:MI A.M.') start_time,
               location
          FROM course c, section s
         WHERE c.course_no   = s.course_no
           AND instructor_id = p_instructor_id
        ORDER BY s.course_no, section_id;
  
  BEGIN
  
     SELECT first_name||' '||last_name
       INTO v_instructor_name
       FROM instructor
      WHERE instructor_id = p_instructor_id;
  
     SELECT COUNT(*)
       INTO v_count
       FROM course c, section s
      WHERE c.course_no   = s.course_no
        AND instructor_id = p_instructor_id
     ORDER BY s.course_no, section_id;
  
  htp.p('<HTML>
         <HEAD><TITLE>Instructor View Classes</TITLE></HEAD>
         <BODY BGCOLOR="#FFFFFF">
         <CENTER>');
  
  IF v_count > 0
  THEN
    htp.p('<H1>Classes for '||v_instructor_name||'</H1>
           <H2>Below is the current list of courses.</H2>
           <TABLE ALIGN="center" BORDER=3 BORDERCOLOR="#0099CC" CELLPADDING=5 WIDTH="100%">
           <TR>
           <TH>Course No.</TH>
           <TH>Course_Description</TH>
           <TH>Section ID</TH>
           <TH>Start_Date/Time</TH>
           <TH>Location</TH>
           <TH>Roster</TH>
           </TR>');
  
     FOR rec IN c_courses
     LOOP
        htp.p('<TR>
               <TD ALIGN="center">'||rec.course_no||'</TD>
               <TD ALIGN="center">'||rec.description||'</TD>
               <TD ALIGN="center">'||rec.section_id||'</TD>
               <TD ALIGN="center">'||rec.start_date||'<br>'||rec.start_time||'</TD>
               <TD ALIGN="center">'||rec.location||'</TD>
               <TD ALIGN="center">'||rec.section_id||'</TD>
               <TD><INPUT TYPE="button" VALUE="Student List"
               onClick="javascript:window.open(''instruct.student_list?p_section_id='||rec.section_id||''',
 ''student_list'', ''toolbar=no, status=yes, menubar=no, scrollbars=auto, resizable=yes, width=640, height=480''); ">
               </TD>
               </TR>');
     END LOOP;
     htp.p('</TABLE>');
  ELSE
    htp.p('<H3>'||v_instructor_name||' is currently on sabbatical.</H3>');
  END IF;
  
  htp.p('</CENTER></BODY></HTML>');
  
  EXCEPTION
  WHEN OTHERS
  THEN
     htp.p('An error occurred:  '||SQLERRM||'.  Please try again later.');
  END instruct_classes;
 

---------------------------------------------------------------
-- NAME : student_list
-- CREATED BY : Susan Boardman
-- DESCRIPTION: Lists students enrolled in section passed in.
-- CREATED BY DATE: January 12, 2003
-- URL:  instruct.student_list
---------------------------------------------------------------
PROCEDURE student_list
    (p_section_id IN section.section_id%TYPE DEFAULT 87)
  IS
     v_section_no section.section_no%TYPE;
     v_course_no  course.course_no%TYPE;
     CURSOR c_students IS
        SELECT s.student_id, first_name, last_name,
               street_address, city, state, s.zip,
               final_grade
          FROM student s, zipcode z, enrollment e
         WHERE s.zip        = z.zip
           AND s.student_id = e.student_id
           AND section_id   = p_section_id
        ORDER BY s.student_id;
  
  BEGIN
  
     SELECT section_no, course_no
       INTO v_section_no, v_course_no
       FROM section
      WHERE section_id = p_section_id;
  
  htp.p('<HTML>
         <HEAD>
           <TITLE>Instructor Classes/Section Student List</TITLE>
         </HEAD>
         <BODY BGCOLOR="#FFFFFF">
         <CENTER>
         <H2>Student List for Section '||v_section_no
               ||' of Course '||v_course_no||'</H2>
         <TABLE BORDER=3 BORDERCOLOR="#0099CC" CELLPADDING=5>
           <TR>
            <TH>Student ID</TH>
            <TH>First Name</TH>
            <TH>Last Name</TH>
            <TH>Address</TH>
            <TH>City, State and Zip</TH>
            <TH>Final Grade</TH>
           </TR>');
 
     FOR rec IN c_students
     LOOP
        htp.p('
            <TR><TD ALIGN="center">'||rec.student_id||'</TD>
                <TD ALIGN="center">'||rec.first_name||'</TD>
                <TD ALIGN="center">'||rec.last_name||'</TD>
                <TD ALIGN="center">'||rec.street_address||'</TD>
                <TD ALIGN="center">'||rec.city||', '||rec.state
                     ||'  '||rec.zip||'</TD>');
     IF rec.final_grade IS NULL
     THEN
        htp.p('<TD ALIGN="center">
               <FORM NAME="my_repeating_form"
                ACTION="student_list_update" METHOD="POST">
                  <INPUT TYPE="hidden" NAME="p_student_id"
                    VALUE="'||rec.student_id||'">
                  <INPUT TYPE="hidden" NAME="p_section_id"
                    VALUE="'||p_section_id||'">
                  <INPUT TYPE="submit"
                    VALUE="Calculate Grade">
               </FORM>
               </TD>');
     ELSE
        htp.p('<TD ALIGN="center">'||rec.final_grade||'</TD>');
     END IF;
        htp.p('</TR>');
     END LOOP;
     htp.p('</TABLE>');
     htp.p('<BR>');
     htp.p('<INPUT TYPE="button" VALUE="Close"
             onClick="window.close();">');
     htp.p('</CENTER>');
     htp.p('</BODY>');
     htp.p('</HTML>');
  
  EXCEPTION
  WHEN OTHERS THEN
     htp.p('An error occurred:  '||SQLERRM||'.  Please try again later.');
  END student_list;

BEGIN /* One time Code */
  FOR rec IN c_instruct_list LOOP
       Instruct_Table( i ).first_name := rec.first_name;
       Instruct_Table( i ).last_name := rec.last_name;
       Instruct_Table( i ).instructor_id := rec.instructor_id;
       i := i + 1;
  END LOOP;

		
 END INSTRUCT; 

Select a Sample Application Code Unit

  1. main_frame (15.2)
  2. top_menu (13.3) / (15.2)
  3. splash (13.1)
  4. student_main_frame (6.3)
  5. students_left_nav (6.3)
  6. search_student (12.4)
  7. get_student (12.4)
  8. student_list (12.4)
  9. student_personal_info (12.4)
  10. student_zipcode (18.5)
  11. update_student (18.5)
  12. instruct (Package Spec and Body)
    • grade_calc (9.2)
    • v_font (9.4)
    • c_instruct_list (9.4)
    • inst_tbl_type (9.4)
    • instruct_table (9.4)
    • [PL/SQL block to load instruct_table] (9.4)
    • instruct_personal_info (11.3)
    • instructor_list_info (11.3)
    • showzip (11.3)
    • instructors_frame (11.1)
    • instructors_left_nav (11.1)
    • update_instructor (11.2)
    • instructor_list_class (11.3)
    • instruct_classes (11.3)
    • student_list (11.2)
  13. classes_main_frame (6.3)
  14. classes_left_nav (6, Building App)
  15. classes_list (6, Building App)
  16. classes_location (13.4)
  17. classes_location_update (13.4)
  18. set_cookie (15.2)
  19. get_cookie (15.2)
  20. cookie_exists (15.2)
  21. visitor_name (15.2)
  22. process_visitor_name (15.2)
  23. student_list_update (not in book)

Main Solutions Page