home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 October A / Pcwk10a98.iso / Inprise / TRIAL / INTRBASE / DATA.Z / PROCS.SQL < prev    next >
Text File  |  1998-03-15  |  8KB  |  342 lines

  1. /*
  2.     THIS FILE IS FOR USE WITH THE TUTORIAL IN "GETTING STARTED",
  3.     IT IS NOT MEANT TO BE USED WITHOUT REFERRING TO THE MANUAL.
  4.  
  5. *   You must change the parameters below to match your
  6. *   server name, database name, username, and password.
  7. *   This file creates stored procedures for the EMPLOYEE database.
  8. */
  9.  
  10. CONNECT "server:\dir\mydb.gdb"
  11. USER "USERNAME" PASSWORD "password";
  12.  
  13. SET TERM ^ ;
  14.  
  15. CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT)
  16. RETURNS (PROJ_ID CHAR(5))
  17. AS
  18. BEGIN
  19.   FOR SELECT PROJ_ID
  20.   FROM EMPLOYEE_PROJECT
  21.   WHERE EMP_NO = :EMP_NO
  22.   INTO :PROJ_ID
  23.   DO
  24.     SUSPEND;
  25. END ^
  26.  
  27.  
  28. CREATE EXCEPTION UNKNOWN_EMP_ID "Invalid employee number or project id."^
  29.  
  30. CREATE PROCEDURE ADD_EMP_PROJ (EMP_NO SMALLINT, PROJ_ID CHAR(5))
  31. AS
  32. BEGIN
  33.   BEGIN
  34.     INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID) 
  35.       VALUES (:EMP_NO, :PROJ_ID);
  36.     WHEN SQLCODE -530 DO
  37.       EXCEPTION UNKNOWN_EMP_ID;
  38.   END
  39.   SUSPEND;
  40. END ^
  41.  
  42.  
  43. CREATE PROCEDURE SUB_TOT_BUDGET (HEAD_DEPT CHAR(3))
  44. RETURNS (TOT_BUDGET NUMERIC(15, 2),
  45.   AVG_BUDGET NUMERIC(15, 2),
  46.   MIN_BUDGET NUMERIC(15, 2),
  47.   MAX_BUDGET NUMERIC(15, 2))
  48. AS
  49. BEGIN
  50.   SELECT SUM(BUDGET), AVG(BUDGET), MIN(BUDGET), MAX(BUDGET)
  51.     FROM DEPARTMENT
  52.     WHERE HEAD_DEPT = :HEAD_DEPT
  53.     INTO :tot_budget, :avg_budget, :min_budget, :max_budget;
  54.   SUSPEND;
  55. END ^
  56.  
  57. CREATE EXCEPTION REASSIGN_SALES 
  58.   "Reassign the sales records before deleting this employee."^
  59.  
  60. CREATE PROCEDURE DELETE_EMPLOYEE (EMP_NUM INTEGER)
  61. AS
  62.   DECLARE VARIABLE any_sales INTEGER;
  63. BEGIN
  64.   any_sales = 0;
  65.  
  66.   SELECT COUNT(PO_NUMBER)
  67.     FROM SALES
  68.     WHERE SALES_REP = :emp_num
  69.     INTO :any_sales;
  70.  
  71.   IF (any_sales > 0) THEN
  72.   BEGIN
  73.     EXCEPTION REASSIGN_SALES;
  74.     SUSPEND;
  75.   END
  76.   
  77.   UPDATE DEPARTMENT
  78.     SET MNGR_NO = NULL
  79.     WHERE MNGR_NO = :emp_num;
  80.  
  81. /* If the employee is a project leader, update project.  */
  82.  
  83.   UPDATE PROJECT
  84.     SET TEAM_LEADER = NULL
  85.     WHERE TEAM_LEADER = :emp_num;
  86.  
  87. /* Delete the employee from any projects. */
  88.  
  89.   DELETE FROM EMPLOYEE_PROJECT
  90.     WHERE EMP_NO = :emp_num;
  91.  
  92. /* Delete old salary records. */
  93.  
  94.   DELETE FROM SALARY_HISTORY
  95.     WHERE emp_no = :emp_num;
  96.  
  97.  /* Delete the employee.  */
  98.  
  99.   DELETE FROM EMPLOYEE
  100.     WHERE EMP_NO = :emp_num;
  101.  
  102.   SUSPEND;
  103. END ^
  104.  
  105. CREATE PROCEDURE DEPT_BUDGET (DNO CHAR(3))
  106. RETURNS (TOT NUMERIC(15, 2))
  107. AS
  108.   DECLARE VARIABLE sumb DECIMAL(12, 2);
  109.   DECLARE VARIABLE rdno CHAR(3);
  110.   DECLARE VARIABLE cnt INTEGER;
  111. BEGIN
  112.   tot = 0;
  113.   SELECT BUDGET FROM DEPARTMENT WHERE DEPT_NO = :dno INTO :tot;
  114.   SELECT COUNT(BUDGET) 
  115.     FROM DEPARTMENT 
  116.     WHERE HEAD_DEPT = :dno 
  117.     INTO :cnt;
  118.  
  119.   IF (cnt = 0) THEN
  120.     SUSPEND;
  121.  
  122.   FOR SELECT DEPT_NO
  123.     FROM DEPARTMENT
  124.     WHERE HEAD_DEPT = :dno
  125.     INTO :rdno
  126.   DO
  127.   BEGIN
  128.     EXECUTE PROCEDURE DEPT_BUDGET :rdno RETURNING_VALUES :sumb;
  129.     tot = tot + sumb;
  130.   END
  131.    
  132.  SUSPEND;
  133. END ^
  134.  
  135. CREATE PROCEDURE ORG_CHART 
  136. RETURNS (head_dept CHAR(25), department CHAR(25), mngr_name CHAR(20),
  137. title CHAR(5), emp_cnt INTEGER)
  138. AS
  139.   DECLARE VARIABLE mngr_no INTEGER;
  140.   DECLARE VARIABLE dno CHAR(3);
  141. BEGIN
  142.   FOR SELECT H.DEPARTMENT, D.DEPARTMENT, D.MNGR_NO, D.DEPT_NO
  143.     FROM DEPARTMENT D
  144.     LEFT OUTER JOIN DEPARTMENT H ON D.HEAD_DEPT = H.DEPT_NO
  145.     ORDER BY D.DEPT_NO
  146.     INTO :head_dept, :department, :mngr_no, :dno
  147.   DO
  148.   BEGIN
  149.     IF (:mngr_no IS NULL) THEN
  150.     BEGIN
  151.       mngr_name = "--TBH--";
  152.       title = "";
  153.     END
  154.    
  155.    ELSE
  156.      SELECT FULL_NAME, JOB_CODE
  157.        FROM EMPLOYEE
  158.        WHERE EMP_NO = :mngr_no
  159.        INTO :mngr_name, :title;
  160.    
  161.    SELECT COUNT(EMP_NO)
  162.      FROM EMPLOYEE
  163.      WHERE DEPT_NO = :dno
  164.      INTO :emp_cnt;
  165.    
  166.    SUSPEND;
  167.  END
  168. END ^
  169.  
  170. CREATE PROCEDURE MAIL_LABEL (CUST_NO INTEGER)
  171. RETURNS (line1 CHAR(40), line2 CHAR(40), line3 CHAR(40), line4 CHAR(40),
  172. line5 CHAR(40), line6 CHAR(40))
  173. AS
  174.   DECLARE VARIABLE customer VARCHAR(25);
  175.   DECLARE VARIABLE first  VARCHAR(15);
  176.   DECLARE VARIABLE last  VARCHAR(20);
  177.   DECLARE VARIABLE addr1  VARCHAR(30);
  178.   DECLARE VARIABLE addr2  VARCHAR(30);
  179.   DECLARE VARIABLE city  VARCHAR(25);
  180.   DECLARE VARIABLE state  VARCHAR(15);
  181.   DECLARE VARIABLE country VARCHAR(15);
  182.   DECLARE VARIABLE postcode VARCHAR(12);
  183.   DECLARE VARIABLE cnt  INTEGER;
  184. BEGIN
  185.   line1 = "";
  186.   line2 = "";
  187.   line3 = "";
  188.   line4 = "";
  189.   line5 = "";
  190.   line6 = "";
  191.  
  192.   SELECT CUSTOMER, CONTACT_FIRST, CONTACT_LAST, ADDRESS_LINE1,
  193.   ADDRESS_LINE2, CITY, STATE_PROVINCE, COUNTRY, POSTAL_CODE
  194.     FROM CUSTOMER
  195.     WHERE CUST_NO = :cust_no
  196.     INTO :customer, :first, :last, :addr1, :addr2, :city, :state, 
  197.     :country, :postcode;
  198.   
  199.   IF (CUSTOMER IS NOT NULL) THEN
  200.     line1 = customer;
  201.   IF (first IS NOT NULL) THEN
  202.     line2 = first || " " || last;
  203.   ELSE
  204.     line2 = last;
  205.   IF (addr1 IS NOT NULL) THEN
  206.     line3 = addr1;
  207.   IF (addr2 IS NOT NULL) THEN
  208.     line4 = addr2;
  209.  
  210.   IF (country = "USA") THEN
  211.   BEGIN
  212.     IF (city IS NOT NULL) THEN
  213.       line5 = city || ", " || state || "  " || postcode;
  214.     ELSE
  215.       line5 = state || "  " || postcode;
  216.   END
  217.   ELSE
  218.   BEGIN
  219.     IF (city IS NOT NULL) THEN
  220.       line5 = city || ", " || state;
  221.     ELSE
  222.       line5 = state;
  223.     line6 = country || "    " || postcode;
  224.  END
  225.   
  226.  SUSPEND;
  227. END ^
  228.  
  229. CREATE EXCEPTION ORDER_ALREADY_SHIPPED "Order status is 'shipped.'"^
  230. CREATE EXCEPTION CUSTOMER_ON_HOLD "This customer is on hold."^
  231. CREATE EXCEPTION CUSTOMER_CHECK "Overdue balance -- can't ship."^
  232.  
  233. CREATE PROCEDURE SHIP_ORDER (PO_NUM CHAR(8))
  234. AS
  235.  
  236.  DECLARE VARIABLE ord_stat CHAR(7);
  237.  DECLARE VARIABLE hold_stat CHAR(1);
  238.  DECLARE VARIABLE cust_no INTEGER;
  239.  DECLARE VARIABLE any_po CHAR(8);
  240. BEGIN
  241.  SELECT S.ORDER_STATUS, C.ON_HOLD, C.CUST_NO
  242.  FROM SALES S, CUSTOMER C
  243.  WHERE PO_NUMBER = :po_num
  244.  AND S.CUST_NO = C.CUST_NO
  245.  INTO :ord_stat, :hold_stat, :cust_no;
  246.  
  247.  /* This purchase order has been already shipped. */
  248.  IF (ord_stat = "shipped") THEN
  249.  BEGIN
  250.   EXCEPTION ORDER_ALREADY_SHIPPED;
  251.   SUSPEND;
  252.  END
  253.   
  254.  /* Customer is on hold. */
  255.  ELSE IF (hold_stat = "*") THEN
  256.  BEGIN
  257.   EXCEPTION CUSTOMER_ON_HOLD;
  258.   SUSPEND;
  259.  END
  260.   
  261.  /*
  262.   * If there is an unpaid balance on orders shipped over 2 months ago,
  263.   * put the customer on hold.
  264.   */
  265.  FOR SELECT po_number
  266.   FROM sales
  267.   WHERE CUST_NO = :cust_no
  268.   AND ORDER_STATUS = "shipped"
  269.   AND paid = "n"
  270.   AND SHIP_DATE < 'NOW' - 60
  271.   INTO :any_po
  272.  DO
  273.  BEGIN
  274.   EXCEPTION CUSTOMER_CHECK;
  275.  
  276.   UPDATE CUSTOMER
  277.   SET on_hold = "*"
  278.   WHERE CUST_NO = :cust_no;
  279.  
  280.   SUSPEND;
  281.  END
  282.   
  283.  /*
  284.   * Ship the order.
  285.   */
  286.  UPDATE SALES
  287.  SET ORDER_STATUS = "shipped", SHIP_DATE = 'NOW'
  288.  WHERE PO_NUMBER = :po_num;
  289.  
  290.  SUSPEND;
  291. END ^
  292.  
  293. CREATE PROCEDURE SHOW_LANGS (CODE VARCHAR(5),
  294. GRADE SMALLINT,
  295. CTY VARCHAR(15))
  296. RETURNS (LANGUAGES VARCHAR(15))
  297. AS
  298.  
  299. DECLARE VARIABLE i INTEGER;
  300. BEGIN
  301.   i = 1;
  302.   WHILE (i <= 5) DO
  303.   BEGIN
  304.     SELECT LANGUAGE_REQ[:i] FROM JOB
  305.     WHERE ((JOB_CODE = :code) AND (JOB_GRADE = :grade) AND (JOB_COUNTRY = :cty)
  306.            AND (LANGUAGE_REQ IS NOT NULL))
  307.     INTO :languages;
  308.     IF (languages = " ") THEN  /* Prints "NULL" instead of blanks */
  309.        languages = "NULL";
  310.     i = i +1;
  311.     SUSPEND;
  312.   END
  313. END ^
  314.  
  315. CREATE PROCEDURE ALL_LANGS RETURNS (CODE VARCHAR(5),
  316. GRADE VARCHAR(5),
  317. COUNTRY VARCHAR(15),
  318. LANG VARCHAR(15))
  319. AS
  320.  
  321.     BEGIN
  322.  FOR SELECT JOB_CODE, JOB_GRADE, JOB_COUNTRY FROM job
  323.   INTO :code, :grade, :country
  324.  
  325.  DO
  326.  BEGIN
  327.      FOR SELECT LANGUAGES FROM SHOW_LANGS
  328.        (:code, :grade, :country) INTO :lang DO
  329.          SUSPEND;
  330.      /* Put nice separators between rows */
  331.      code = "=====";
  332.      grade = "=====";
  333.      country = "===============";
  334.      lang = "==============";
  335.      SUSPEND;
  336.  END
  337.     END ^
  338. SET TERM ; ^
  339. COMMIT WORK ;
  340. SET TERM ^ ;
  341.  
  342.