feat: update structure
This commit is contained in:
100
cs2102/labs/project/part3.sql
Normal file
100
cs2102/labs/project/part3.sql
Normal file
@@ -0,0 +1,100 @@
|
||||
CREATE OR REPLACE PROCEDURE create_practice_quiz(
|
||||
quiz_name VARCHAR,
|
||||
creator_id VARCHAR,
|
||||
num_questions INT,
|
||||
) AS
|
||||
$$
|
||||
DECLARE
|
||||
quiz_id INT;
|
||||
c CURSOR FOR (SELECT * FROM quiz_questions);
|
||||
quiz_qn RECORD;
|
||||
random_no INT;
|
||||
num_qns INT = (SELECT COUNT(*) FROM questions);
|
||||
BEGIN
|
||||
INSERT INTO quizzes (id, name, published, total_points, avail_from, avail_to, time_limit, mandatory, status,
|
||||
creator)
|
||||
values ((SELECT id + 1 FROM quizzes ORDER BY id DESC LIMIT 1), -- get last id
|
||||
quiz_name,
|
||||
true,
|
||||
0,
|
||||
NOW(),
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE,
|
||||
'public',
|
||||
creator_id)
|
||||
RETURNING id
|
||||
INTO quiz_id;
|
||||
OPEN c;
|
||||
FOR val IN 1..num_questions LOOP
|
||||
random_no = FLOOR(random() * (num_questions));
|
||||
END LOOP;
|
||||
CLOSE c;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE PROCEDURE create_practice_quiz (
|
||||
quiz_name varchar,
|
||||
creator_id varchar,
|
||||
num_questions int
|
||||
)
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
WITH quiz AS (
|
||||
INSERT INTO quizzes (
|
||||
id,
|
||||
name,
|
||||
published,
|
||||
num_attempts,
|
||||
avail_from,
|
||||
total_points,
|
||||
mandatory,
|
||||
status,
|
||||
creator
|
||||
)
|
||||
VALUES (
|
||||
(SELECT count(*) + 1 FROM quizzes),
|
||||
quiz_name,
|
||||
true,
|
||||
0,
|
||||
now(),
|
||||
0,
|
||||
false,
|
||||
'public',
|
||||
creator_id
|
||||
)
|
||||
RETURNING
|
||||
id,
|
||||
status,
|
||||
creator
|
||||
)
|
||||
INSERT INTO quiz_questions (
|
||||
quiz_id,
|
||||
question_id,
|
||||
points,
|
||||
mandatory,
|
||||
position
|
||||
)
|
||||
SELECT
|
||||
q.id,
|
||||
qn.id,
|
||||
0,
|
||||
false,
|
||||
ROW_NUMBER() OVER (ORDER BY random())
|
||||
FROM
|
||||
questions qn,
|
||||
quiz q
|
||||
WHERE
|
||||
qn.valid = true
|
||||
AND (
|
||||
qn.status = 'public'
|
||||
OR qn.creator = q.creator
|
||||
)
|
||||
ORDER BY random()
|
||||
LIMIT num_questions;
|
||||
END
|
||||
$$;
|
||||
|
||||
SELECT FLOOR(random() * (SELECT COUNT(*) FROM questions));
|
||||
Reference in New Issue
Block a user