Thanks. That fixed the problem. I put all of my DECLARE statements at the
beginning of the procedure. I finally got the thing to compile and it looks
like this:
DELIMITER $$
DROP PROCEDURE IF EXISTS `code_library`.`Search_Code_Samples` $$
CREATE [EMAIL PROTECTED] PROCEDURE `Search_Code_Samples`(
IN search_words VARCHAR(300)
, IN multi_word_condition VARCHAR(3)
, IN language_id INT
, IN sample_type CHAR(1)
)
READS SQL DATA
COMMENT 'Prepares and executes SQL to find records according to the
data'
BEGIN
DECLARE Base_SQL VARCHAR(1500);
DECLARE Filter_Clause VARCHAR(3000);
DECLARE Final_SQL VARCHAR(5500);
DECLARE First_Instance CHAR(1);
DECLARE len_search_words INT;
DECLARE word_idx INT;
DECLARE last_pos INT;
DECLARE word_length INT;
DECLARE new_word varchar(200);
DECLARE Search_Clause VARCHAR(1000);
DECLARE this_Word varchar(200);
DECLARE no_more_rows INT default 0;
DECLARE words_list CURSOR FOR SELECT Search_Word FROM Temp_Word_List;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = 1;
-- First handle the list of search words
IF (multi_word_condition IS NULL OR multi_work_condition = '' OR
multi_word_condition = ' ') THEN
SET multi_word_condition = 'AND';
END IF;
IF (sample_type IS NULL) OR (sample_type = ' ') THEN
SET sample_type = 'A';
END IF;
SET Base_SQL = 'select * from CodeSamples_View ';
SET Filter_Clause = '';
SET First_Instance = 'Y';
IF (search_words IS NOT NULL) AND (search_words <> '') AND (search_words <>
' ') THEN
-- Parse the list of search words by spaces
SET len_search_words = LENGTH(search_words);
SET word_idx = 1;
SET last_pos = 1;
CREATE TEMPORARY TABLE Temp_Word_List (Search_Word VARCHAR(200) NOT NULL);
WHILE (word_idx <= len_search_words) DO
IF (SUBSTRING(search_words, word_idx, 1) = ' ') THEN
SET word_length = word_idx - last_pos;
SET new_word = TRIM(SUBSTRING(search_words, last_pos, word_length));
SET last_pos = word_idx;
IF (new_word <> '') THEN
INSERT INTO Temp_Word_List VALUES (new_word);
END IF;
END IF;
SET word_idx = word_idx + 1;
END WHILE;
-- Put in the very last word
IF (word_idx > last_pos) THEN
SET word_length = word_idx - last_pos;
SET new_word = TRIM(SUBSTRING(search_words, last_pos, word_length));
IF (new_word <> '') THEN
INSERT INTO Temp_Word_List VALUES (new_word);
END IF;
END IF;
-- Generate the SQL clause for the search words.
OPEN words_list;
REPEAT
FETCH words_list INTO this_Word;
IF (no_more_rows <> 1) THEN
IF (First_Instance = 'Y') THEN
SET First_Instance = 'N';
ELSE
SET Filter_Clause = concat(Filter_Clause, multi_word_condition, ' ');
END IF;
SET Filter_Clause = concat(Filter_Clause, 'match(title,description)
against(''', this_Word, ''') ');
END IF;
UNTIL (no_more_rows = 1) END REPEAT;
CLOSE words_list;
DROP TEMPORARY TABLE Temp_Word_List;
END IF;
-- Language Id
IF (language_id IS NOT NULL AND language_id > 0) THEN
IF (First_Instance = 'Y') THEN
SET First_Instance = 'N';
ELSE
SET Filter_Clause = concat(Filter_Clause, ' AND ');
END IF;
SET Filter_Clause = concat(Filter_Clause, 'language = ', cast(language_id
as CHAR(4)), ' ');
END IF;
-- Sample type
IF (sample_type IS NOT NULL AND sample_type <> 'A' AND sample_type <> ''
AND sample_type <> ' ') THEN
IF (First_Instance = 'Y') THEN
SET First_Instance = 'N';
ELSE
SET Filter_Clause = concat(Filter_Clause, ' AND ');
END IF;
SET Filter_Clause = concat(Filter_Clause, 'sample_type = ''', sample_type,
'''');
END IF;
-- Construct the final SQL statement.
IF (Filter_Clause = '') THEN
SET @Final_SQL = Base_SQL;
ELSE
SET @Final_SQL = concat(Base_SQL, 'WHERE ', Filter_Clause);
END IF;
-- Execute the constructed SQL Statement.
PREPARE search_statement FROM @Final_SQL;
EXECUTE search_statement;
DEALLOCATE PREPARE search_statement;
END $$
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]