/ / Створіть збережену процедуру із заявою справи - mysql, sql, storage-procedure

Створити збережену процедуру із заявою про ситуацію - mysql, sql, stored-procedures

Я намагаюся створити збережену процедуру і яздається, розуміють неправильно. Я використовую SQL лише тоді, коли мені потрібно, тому, будь ласка, пробачте розробника та допоможіть. Я хочу включити в збережену процедуру запит SQL, який робить внутрішнє з'єднання між двома таблицями: user_students та student_grades_summary. Ось збережена процедура, яку я написав:

CREATE PROCEDURE GradeStudents( in scoreover100 float, out s_grade char(3))
BEGIN
CASE
WHEN (student_grades_summary.aggregate >= 80 && student_grades_summary.aggregate <= 100 && student_grades_summary.level = "JSS") THEN
SET student_grades_summary.grade = "A1";
WHEN(student_grades_summary.aggregate >= 70 AND student_grades_summary.aggregate <= 79 AND student_grades_summary.level = "JSS") THEN
SET student_grades_summary.grade = "B1";
WHEN (student_grades_summary.aggregate >= 60 AND student_grades_summary.aggregate <= 69 AND student_grades_summary.level = "JSS") THEN
SET student_grades_summary.grade = "B2";
WHEN(student_grades_summary.aggregate >= 55 AND student_grades_summary.aggregate <= 59 AND student_grades_summary.level = "JSS") THEN
SET student_grades_summary.grade = "P1";
WHEN(student_grades_summary.aggregate >= 50 AND student_grades_summary.aggregate <= 54 AND student_grades_summary.level = "JSS") THEN
SET student_grades_summary.grade = "P2";
WHEN(student_grades_summary.aggregate <= 49 AND student_grades_summary.level = "JSS")
SET student_grades_summary.grade = "F";
WHEN(student_grades_summary.aggregate >= 85 AND student_grades_summary.aggregate <= 100 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "A1";
WHEN(student_grades_summary.aggregate >= 80 AND student_grades_summary.aggregate <= 84 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "B2";
WHEN(student_grades_summary.aggregate >= 75 AND student_grades_summary.aggregate <= 79 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "B3";
WHEN(student_grades_summary.aggregate >= 70 AND student_grades_summary.aggregate <= 74 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "C4";
WHEN(student_grades_summary.aggregate >= 65 AND student_grades_summary.aggregate <= 69 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "C5";
WHEN(student_grades_summary.aggregate >= 60 AND student_grades_summary.aggregate <= 64 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "C6";
WHEN(student_grades_summary.aggregate >= 55 AND student_grades_summary.aggregate <= 59 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "D7";
WHEN(student_grades_summary.aggregate >= 50 AND student_grades_summary.aggregate <= 54 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "E8";
WHEN(student_grades_summary.aggregate <= 49 AND student_grades_summary.level = "SSS") THEN
SET student_grades_summary.grade = "F9";
END CASE;

І це запит SQL, який я намагаюсявключити збережену процедуру в. В основному я намагаюся додати значення в стовпець класу в student_grades_summary, використовуючи збережену процедуру. У будь-якому випадку тут sql:

select user_students.fname as FirstName, user_students.lname as LastName
, student_grades_summary.subject as CoreSubjects
, student_grades_summary.aggregate as Scoreover100
, student_grades_summary.subjectrank as Position
, student_grades_summary.term as Term
, student_grades_summary.level as Level
, student_grades_summary.class as Class
, student_grades_summary.section as Section
, student_grades_summary.session as Session
FROM student_grades_summary
JOIN user_students
ON student_grades_summary.level = user_students.level
AND student_grades_summary.class = user_students.class
AND student_grades_summary.section = user_students.section
JOIN config_grades
ON student_grades_summary.level = config_grades.level
WHERE user_students.level = "JSS"
AND user_students.class = "2"
AND student_grades_summary.session = "2015/2016"

Отже, у phpmyadmin я отримую багато червоних чітко викладених рядків, які говорять про помилку в SQL. Я спробував подивитися на код і виявити помилку, але не зміг.

Відповіді:

0 для відповіді № 1

Я знову і знову бачу цей час. Ви не думаєте в SQL. У SQL потрібно мислити наборами. Не думайте в підпрограмах, думайте про множини. У цьому випадку ваш набір - це перелік критеріїв для оцінки, який ми можемо представити як таблицю (я називаю це grade_lookup)

aggmin aggmax lvl   grade
80       100  "JSS" "A1"
70       79   "JSS" "B1"
60       69   "JSS" "B2"
55       59   "JSS" "P1"
50       54   "JSS" "P2"
0        49   "JSS" "F"
85       100  "SSS" "A1"
80       84   "SSS" "B2"
75       79   "SSS" "B3"
70       74   "SSS" "C4"
65       69   "SSS" "C5"
60       64   "SSS" "C6"
55       59   "SSS" "D7"
50       54   "SSS" "E8"
0        49   "SSS" "F9"

Після того, як у вас є таблиця grade_lookup, ви приєднуєтесь до неї і отримуєте свою оцінку - виклик функції не потрібен - так:

select user_students.fname as FirstName, user_students.lname as LastName
, s.subject as CoreSubjects
, s.aggregate as Scoreover100
, s.subjectrank as Position
, s.term as Term
, s.level as Level
, s.class as Class
, s.section as Section
, s.session as Session

-- the result of our lookup
, COALESCE(L.grade ,"lookup fail") as Grade

FROM student_grades_summary S
JOIN user_students
ON student_grades_summary.level = user_students.level
AND student_grades_summary.class = user_students.class
AND student_grades_summary.section = user_students.section
JOIN config_grades
ON student_grades_summary.level = config_grades.level

-- join to grade lookup
LEFT JOIN GRADE_LOOKUP L ON s.aggregate >= L.aggmin
and s.aggregate <= L.aggmax
and s.level = L.lvl

WHERE user_students.level = "JSS"
AND user_students.class = "2"
AND student_grades_summary.session = "2015/2016"

Зауважте, я щойно вклав це у ваш оператор select - я не знаю, чи ваш твердження select правильний чи ні - не вважайте моє повторне використання вашого прикладу кодом як перевірку правильності його.