Questa procedura memorizzata su cui sto lavorando su alcuni errori in alcune occasioni. Ricevo un errore Result consisted of more than one row
, ma solo per determinati valori JOB_ID_INPUT
. Capisco che cosa causa questo errore, e quindi ho cercato di essere molto attento ad assicurarmi che i miei valori di ritorno siano scalari quando dovrebbero essere. È difficile vedere nella procedura memorizzata, quindi non sono sicuro di dove possa essere generato l'errore. Dato che l'errore è stato generato in modo condizionato, penso che la memoria potrebbe essere un problema o il riutilizzo del cursore. Non lavoro con i cursori che spesso non sono sicuro. Grazie a tutti coloro che aiutano.Il risultato di MySQL consisteva di più di una riga nella stored procedure.
DROP PROCEDURE IF EXISTS export_job_candidates;
DELIMITER $$
CREATE PROCEDURE export_job_candidates (IN JOB_ID_INPUT INT(11))
BEGIN
DECLARE candidate_count INT(11) DEFAULT 0;
DECLARE candidate_id INT(11) DEFAULT 0;
# these are the ib variables
DECLARE _overall_score DECIMAL(5, 2) DEFAULT 0.0;
# declare the cursor that will be needed for this SP
DECLARE curs CURSOR FOR SELECT user_id FROM job_application WHERE job_id = JOB_ID_INPUT;
# this table stores all of the data that will be returned from the various tables that will be joined together to build the final export
CREATE TEMPORARY TABLE IF NOT EXISTS candidate_stats_temp_table (
overall_score_ib DECIMAL(5, 2) DEFAULT 0.0
) engine = memory;
SELECT COUNT(job_application.id) INTO candidate_count FROM job_application WHERE job_id = JOB_ID_INPUT;
OPEN curs;
# loop controlling the insert of data into the temp table that is retuned by this function
insert_loop: LOOP
# end the loop if there is no more computation that needs to be done
IF candidate_count = 0 THEN
LEAVE insert_loop;
END IF;
FETCH curs INTO candidate_id;
# get the ib data that may exist for this user
SELECT
tests.overall_score
INTO
_overall_score
FROM
tests
WHERE
user_id = candidate_id;
#build the insert for the table that is being constructed via this loop
INSERT INTO candidate_stats_temp_table (
overall_score
) VALUES (
_overall_score
);
SET candidate_count = candidate_count - 1;
END LOOP;
CLOSE curs;
SELECT * FROM candidate_stats_temp_table WHERE 1;
END $$
DELIMITER ;
Questa è stata una causa di problema da uno dei miei select ... in dichiarazioni che necessitano di un caso limite. Grazie. Stavo fissando questo SP per così tanto tempo che stavo trascurando cose semplici come quella. – usumoio