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]

Reply via email to