In this assignment, you will use the CAR HIRE database. The CAR HIRE database including appropriate data will be made available on the USQ Oracle server. You can query these tables as if they are in your own schema but you are not permitted to insert or update data in these tables. The specification for the CAR HIRE database is as follows:
The table descriptions appear below, including the column names, datatypes and the meanings for values in the columns. Familiarise yourself with the tables and the data.
Question 1:
Write a stored procedure that accepts the post code in which the customer resides as the input parameter. The procedure should then use an explicit cursor to display comprehensive details about each customer, the number of bookings that customer has made and the total cost of all completed rentals for that customer.
Procedure:
A) Use a fully declared explicit cursor to find and display comprehensive details for each customer.
B) Use an implicit cursor and a SQL function to calculate the number of bookings the customer has made. Display the number of bookings.
C) Calculate the total cost. In order to calculate the total cost, you may not use any SQL functions (e.g. SUM) and you must find a way of using local variables to do the arithmetic. Only completed rentals are used in this calculation. When miles_in has a value, the rental is complete. Display the total cost when the computation is complete.
Submit the code and a screen dump of the output when the program is run.
Question 2:
Write a function that calculates the average miles travelled for a particular car (registration) for all completed bookings made for that car.
Write a second function that displays the maximum amount paid (amount due) for a particular car (registration) for all completed bookings made for that car.
Write ONE SQL statement that displays the registration, model_name and date bought for each car and calls the two functions to display the average miles travelled and the maximum amount paid for that car.
Display the output of the SQL statement.
Submit the code and a screen dump of the output.
Question 3:
The company is concerned about hackers making changes to financial details for bookings, in particular the paid flag and the amount due. You will create a database trigger to monitor changes.
Create a copy of the I_BOOKING table in your own schema by using the following command: CREATE TABLE GBOOKING AS SELECT * FROM I_BOOKING. Now, create a database trigger on the GBOOKING table that fires after an UPDATE. The trigger should fire for each row. The trigger should fire if there is any change to amount_due or paid and should insert the booking number, and the OLD and NEW values of each of these columns into a the table BOOKING_CHANGE. This table may be created using the command: CREATE TABLE BOOKING_CHANGE AS SELECT BOOKING_NO, AMOUNT_DUE, PAID FROM I_BOOKING WHERE BOOKING_NO = 0;
Question 4:
Write a anonymous block that finds the car that has generated the most revenue (use amount_due here). Only include rentals that are complete. A completed rental involves a situation where the car has been returned and payment may (or may not) have been made. Note that the top car in terms of revenue may not be the same as the top car in terms of rental volume. Also note that, depending upon the date range selected, no car may be selected. Therefore, test with the date range 1 to 31 October, 2012 or a date range of several years. Exclude from your calculations any booking when the miles travelled is less than 100, the rental period is less than two days or the registration begins with a G. This exclusion should not be done in the select statement i.e. it should be done after the BEGIN using IF.
The anonymous block should display the following: registration and revenue generated.
You may not use any function in this program, for example SUM, COUNT, AVG, MIN, MAX. Therefore, you will need to use local variables to hold values and perhaps re-use explicit cursors.
Run the anonymous block from ISQLPLUS and include a screen dump of the output.
Question 5:
The table CUSTOMER_MASTER is a mirror of I_CUSTOMER, BOOKING_MASTER is a mirror of I_BOOKING and CAR_MASTER is a mirror of I_CAR. None of these tables belong to you but you have read and write access to them. Write PL/SQL stored procedures that insert two rows into the tables CUSTOMER_MASTER AND BOOKING_MASTER and two rows into the table CAR_MASTER. Also, write an anonymous block that calls the procedures.
Examine the tables I_CUSTOMER, I_CAR and I_BOOKING carefully first, paying particular attention to the data. Your procedures and anonymous block should meet the following criteria:
A) The anonymous block should display the number of rows currently in each the three tables CUSTOMER_MASTER, CAR_MASTER AND BOOKING_MASTER. Then, the anonymous block should call the procedures and pass all the data to be entered into the tables to the procedures. It is assumed that three procedures will be required (i.e. one per table) but, if you are able to write a hybrid procedure to accomplish all the tasks, that is acceptable. Next, the anonymous block should display the total number of rows that the procedures have inserted into the database. Finally, the number of rows in each of the three tables CUSTOMER_MASTER, CAR_MASTER AND BOOKING_MASTER after the inserts should be displayed.
B) The procedures should use parameters to process the data passed from the anonymous block and insert the data into the appropriate table. The procedures should keep a count of each row inserted and pass the count back to the calling anonymous block.
C) For the CAR_MASTER table, you should create a primary key using your own initiative but, for the other two tables, your procedure should find the current highest value of the primary key and allocate the next value.
D) It is expected that you do your best to create data at least of the same standard as the data in the base tables. You will be penalised if you create poor quality data.
E) For the CUSTOMER_MASTER table, your new customers should use one of the town, county and post code combinations used by an existing customer.
F) For the CAR_MASTER table, make sure that the model_name and car_group_name match primary key values in the appropriate tables and that the statistical information (e.g. date bought) is consistent. One car should reflect a date bought somewhere in 2011, the other 2012.
G) For the BOOKING_MASTER table, use the two cars you have created. This will be the most complex insert. Make sure that registration number and model name match rows that already exist in the applicable tables. The person who does the reservation should reflect a name already in the table. The miles in/out columns should be consistent with the mileage values in the CAR_MASTER table and the amount due should be calculated using the rates in the CAR_MASTER table. One row should reflect a completed booking while the other should reflect a booking that is still in progress, i.e. the car has not yet been returned.
H) OUTPUT: Provide a screen dump of your anonymous block and the output created when this is run.