101 lines
2.1 KiB
PL/PgSQL
101 lines
2.1 KiB
PL/PgSQL
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));
|