home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 May / PCWorld_1999-05_cd.bin / software / Vyzkuste / inprise / DOC / TUTORIAL / PROCS.SQL < prev    next >
Text File  |  1998-10-18  |  8KB  |  352 lines

  1. /*  Procs.sql
  2. *   THIS FILE IS FOR USE WITH THE TUTORIAL. IT IS NOT MEANT
  3. *   TO BE USED WITHOUT REFERRING TO THE ACCOMPANYING TEXT.
  4. *
  5. *   You must change the parameters below to match your
  6. *   server name, database name, username, and password.
  7. *   This file defines domains for the TUTORIAL database.
  8. */
  9.  
  10. CONNECT 'c:\interbase5\tutorial\tutorial.gdb'
  11. USER 'TUTOR' PASSWORD 'tutor4ib';
  12.  
  13.  
  14. /*  You create Get_emp_proj UNKNOWN_EMP_ID, Add_emp_proj, and Dept_budget
  15. *   by hand in the tutorial exercises. The code is included here for
  16. *   reference and includes the SET TERM statements and terminators
  17. *   necessary to run a script. If you want to enter these procedures
  18. *   and exceptions using the script, terminate this comment and remove
  19. *   the asterisks from in from of the code lines.
  20. *
  21. *  SET TERM ^ ;
  22. *
  23. *  CREATE PROCEDURE Get_emp_proj (v_empno SMALLINT)
  24. *  RETURNS (v_projid CHAR(5))
  25. *  AS
  26. *  BEGIN
  27. *    FOR SELECT proj_id
  28. *    FROM Employee_project
  29. *    WHERE emp_no = :v_empno
  30. *    INTO :v_projid
  31. *    DO
  32. *      SUSPEND;
  33. *  END ^
  34. *
  35. *
  36. *  CREATE EXCEPTION UNKNOWN_EMP_ID "Invalid employee number or project ID."^
  37. *
  38. *  CREATE PROCEDURE Add_emp_proj (v_empno SMALLINT, v_projid CHAR(5))
  39. *  AS
  40. *  BEGIN
  41. *      INSERT INTO Employee_project (emp_no, proj_id)
  42. *        VALUES (:v_empno, :v_projid);
  43. *      WHEN SQLCODE -530 DO
  44. *        EXCEPTION UNKNOWN_EMP_ID;
  45. *  END ^
  46. *
  47. *
  48. *  CREATE PROCEDURE Dept_budget (v_dno CHAR(3))
  49. *  RETURNS (total_budget NUMERIC(15, 2))
  50. *  AS
  51. *    DECLARE VARIABLE sumb DECIMAL(12, 2);
  52. *    DECLARE VARIABLE rdno CHAR(3);
  53. *    DECLARE VARIABLE cnt INTEGER;
  54. *  BEGIN
  55. *    total_budget = 0;
  56. *    SELECT budget FROM Department WHERE dept_no = :v_dno INTO :total_budget;
  57. *    SELECT COUNT(budget)
  58. *      FROM Department
  59. *      WHERE head_dept = :v_dno
  60. *      INTO :cnt;
  61. *
  62. *    IF (cnt = 0) THEN
  63. *      SUSPEND;
  64. *
  65. *    FOR SELECT dept_no
  66. *      FROM Department
  67. *      WHERE head_dept = :v_dno
  68. *      INTO :rdno
  69. *    DO
  70. *    BEGIN
  71. *      EXECUTE PROCEDURE Dept_budget :rdno RETURNING_VALUES :sumb;
  72. *      total_budget = total_budget + sumb;
  73. *    END
  74. *  END ^
  75. */
  76.  
  77.  
  78. SET TERM ^ ;
  79.  
  80. CREATE PROCEDURE Sub_tot_budget (v_head CHAR(3))
  81. RETURNS (total_budget NUMERIC(15, 2),
  82.   avg_budget NUMERIC(15, 2),
  83.   min_budget NUMERIC(15, 2),
  84.   max_budget NUMERIC(15, 2))
  85. AS
  86. BEGIN
  87.   SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget)
  88.     FROM Department
  89.     WHERE head_dept = :v_head
  90.     INTO :total_budget, :avg_budget, :min_budget, :max_budget;
  91.   SUSPEND;
  92. END ^
  93.  
  94.  
  95. CREATE EXCEPTION REASSIGN_SALES
  96.   "Reassign the sales records before deleting this employee."^
  97.  
  98.  
  99. CREATE PROCEDURE Delete_employee (v_empno INTEGER)
  100. AS
  101.   DECLARE VARIABLE any_sales INTEGER;
  102. BEGIN
  103.   any_sales = 0;
  104.  
  105.   SELECT COUNT(po_number)
  106.     FROM Sales
  107.     WHERE sales_rep = :v_empno
  108.     INTO :any_sales;
  109.  
  110.   IF (any_sales > 0) THEN
  111.   BEGIN
  112.     EXCEPTION REASSIGN_SALES;
  113.     SUSPEND;
  114.   END
  115.  
  116.   UPDATE Department
  117.     SET mngr_no = NULL
  118.     WHERE mngr_no = :v_empno;
  119.  
  120. /* If the employee is a project leader, update project.  */
  121.  
  122.   UPDATE Project
  123.     SET team_leader = NULL
  124.     WHERE team_leader = :v_empno;
  125.  
  126. /* Delete the employee from any projects. */
  127.  
  128.   DELETE FROM Employee_project
  129.     WHERE emp_no = :v_empno;
  130.  
  131. /* Delete old salary records. */
  132.  
  133.   DELETE FROM Salary_history
  134.     WHERE emp_no = :v_empno;
  135.  
  136.  /* Delete the employee.  */
  137.  
  138.   DELETE FROM Employee
  139.     WHERE emp_no = :v_empno;
  140.  
  141.   SUSPEND;
  142. END ^
  143.  
  144.  
  145. CREATE PROCEDURE Org_chart
  146. RETURNS (head_department CHAR(25), dept_name CHAR(25), mngr_name CHAR(20),
  147. title CHAR(5), empl_cnt INTEGER)
  148. AS
  149.   DECLARE VARIABLE manager_no INTEGER;
  150.   DECLARE VARIABLE dno CHAR(3);
  151. BEGIN
  152.   FOR SELECT H.department, D.department, D.mngr_no, D.dept_no
  153.     FROM Department D
  154.     LEFT OUTER JOIN Department H ON D.head_dept = H.dept_no
  155.     ORDER BY D.dept_no
  156.     INTO :head_department , :dept_name , :manager_no, :dno
  157.   DO
  158.   BEGIN
  159.     IF (:manager_no IS NULL) THEN
  160.     BEGIN
  161.       mngr_name = "--TBH--";
  162.       title = "";
  163.     END
  164.  
  165.    ELSE
  166.      SELECT full_name, job_code
  167.        FROM Employee
  168.        WHERE emp_no = :manager_no
  169.        INTO :mngr_name, :title;
  170.  
  171.    SELECT COUNT(emp_no)
  172.      FROM Employee
  173.      WHERE dept_no = :dno
  174.      INTO :empl_cnt;
  175.  
  176.    SUSPEND;
  177.  END
  178. END ^
  179.  
  180. CREATE PROCEDURE Mail_label (v_cust_no INTEGER)
  181. RETURNS (line1 CHAR(40), line2 CHAR(40), line3 CHAR(40), line4 CHAR(40),
  182. line5 CHAR(40), line6 CHAR(40))
  183. AS
  184.   DECLARE VARIABLE custname VARCHAR(25);
  185.   DECLARE VARIABLE first  VARCHAR(15);
  186.   DECLARE VARIABLE last  VARCHAR(20);
  187.   DECLARE VARIABLE addr1  VARCHAR(30);
  188.   DECLARE VARIABLE addr2  VARCHAR(30);
  189.   DECLARE VARIABLE custcity  VARCHAR(25);
  190.   DECLARE VARIABLE state  VARCHAR(15);
  191.   DECLARE VARIABLE cntry VARCHAR(15);
  192.   DECLARE VARIABLE postcode VARCHAR(12);
  193.   DECLARE VARIABLE cnt  INTEGER;
  194. BEGIN
  195.   line1 = "";
  196.   line2 = "";
  197.   line3 = "";
  198.   line4 = "";
  199.   line5 = "";
  200.   line6 = "";
  201.  
  202.   SELECT customer, contact_first, contact_last, address_line1,
  203.   address_line2, city, state_province, country, postal_code
  204.     FROM Customer
  205.     WHERE cust_no= :v_cust_no
  206.     INTO :custname, :first, :last, :addr1, :addr2, :custcity, :state,
  207.     :cntry, :postcode;
  208.  
  209.   IF (custname IS NOT NULL) THEN
  210.     line1 = custname;
  211.   IF (first IS NOT NULL) THEN
  212.     line2 = first || " " || last;
  213.   ELSE
  214.     line2 = last;
  215.   IF (addr1 IS NOT NULL) THEN
  216.     line3 = addr1;
  217.   IF (addr2 IS NOT NULL) THEN
  218.     line4 = addr2;
  219.  
  220.   IF (cntry = "USA") THEN
  221.   BEGIN
  222.     IF (custcity IS NOT NULL) THEN
  223.       line5 = custcity || ", " || state || "  " || postcode;
  224.     ELSE
  225.       line5 = state || "  " || postcode;
  226.   END
  227.   ELSE
  228.   BEGIN
  229.     IF (custcity IS NOT NULL) THEN
  230.       line5 = custcity || ", " || state;
  231.     ELSE
  232.       line5 = state;
  233.     line6 = cntry || "    " || postcode;
  234.  END
  235.  
  236.  SUSPEND;
  237. END ^
  238.  
  239. CREATE EXCEPTION ORDER_ALREADY_SHIPPED "Order status is 'shipped.'"^
  240. CREATE EXCEPTION CUSTOMER_ON_HOLD "This customer is on hold."^
  241. CREATE EXCEPTION CUSTOMER_CHECK "Overdue balance -- can't ship."^
  242.  
  243. CREATE PROCEDURE Ship_order (v_po_num CHAR(8))
  244. AS
  245.  
  246.  DECLARE VARIABLE ord_stat CHAR(7);
  247.  DECLARE VARIABLE hold_stat CHAR(1);
  248.  DECLARE VARIABLE cust_num INTEGER;
  249.  DECLARE VARIABLE any_po CHAR(8);
  250. BEGIN
  251.  SELECT S.order_status, C.on_hold, C.cust_no
  252.  FROM Sales S, Customer C
  253.  WHERE po_number = :v_po_num
  254.  AND S.cust_no= C.cust_no
  255.  INTO :ord_stat, :hold_stat, :cust_num;
  256.  
  257.  /* This purchase order has been already shipped. */
  258.  IF (ord_stat = "shipped") THEN
  259.  BEGIN
  260.   EXCEPTION ORDER_ALREADY_SHIPPED;
  261.   SUSPEND;
  262.  END
  263.  
  264.  /* Customer is on hold. */
  265.  ELSE IF (hold_stat = "*") THEN
  266.  BEGIN
  267.   EXCEPTION CUSTOMER_ON_HOLD;
  268.   SUSPEND;
  269.  END
  270.  
  271.  /*
  272.   * If there is an unpaid balance on orders shipped over 2 months ago,
  273.   * put the customer on hold.
  274.   */
  275.  FOR SELECT po_number
  276.   FROM Sales
  277.   WHERE cust_no= :cust_num
  278.   AND order_status = "shipped"
  279.   AND paid = "n"
  280.   AND ship_date < 'NOW' - 60
  281.   INTO :any_po
  282.  DO
  283.  BEGIN
  284.   EXCEPTION CUSTOMER_CHECK;
  285.  
  286.   UPDATE Customer
  287.   SET on_hold = "*"
  288.   WHERE cust_no= :cust_num;
  289.  
  290.   SUSPEND;
  291.  END
  292.  
  293.  /*
  294.   * Ship the order.
  295.   */
  296.  UPDATE Sales
  297.  SET order_status = "shipped", SHIP_DATE = 'NOW'
  298.  WHERE po_number = :v_po_num;
  299.  
  300.  SUSPEND;
  301. END ^
  302.  
  303. CREATE PROCEDURE Show_langs (v_code VARCHAR(5),
  304. v_grade SMALLINT,
  305. v_cty VARCHAR(15))
  306. RETURNS (languages VARCHAR(15))
  307. AS
  308.  
  309. DECLARE VARIABLE i INTEGER;
  310. BEGIN
  311.   i = 1;
  312.   WHILE (i <= 5) DO
  313.   BEGIN
  314.     SELECT language_req[:i] FROM Job
  315.     WHERE ((job_code = :v_code) AND (job_grade = :v_grade) AND (job_country = :v_cty)
  316.            AND (language_req IS NOT NULL))
  317.     INTO :languages;
  318.     IF (languages = " ") THEN  /* Prints "NULL" instead of blanks */
  319.        languages = "NULL";
  320.     i = i +1;
  321.     SUSPEND;
  322.   END
  323. END ^
  324.  
  325. CREATE PROCEDURE All_langs RETURNS (code VARCHAR(5),
  326. grade VARCHAR(5),
  327. country VARCHAR(15),
  328. lang VARCHAR(15))
  329. AS
  330.  
  331.     BEGIN
  332.  FOR SELECT job_code, job_grade, job_country FROM Job
  333.   INTO :code, :grade, :country
  334.  
  335.  DO
  336.  BEGIN
  337.      FOR SELECT languages FROM Show_langs
  338.        (:code, :grade, :country) INTO :lang DO
  339.          SUSPEND;
  340.      /* Put nice separators between rows */
  341.      code = "=====";
  342.      grade = "=====";
  343.      country = "===============";
  344.      lang = "==============";
  345.      SUSPEND;
  346.  END
  347.     END ^
  348. SET TERM ; ^
  349. COMMIT WORK ;
  350.  
  351. 
  352.