Attached is the (I think) corrected version.. If you do like I said and cut the number in half you see fairly quickly why it didn't work. I'm sending yours back so you can easily run a diff to see what I did. Let me know if this (attached "cedars") works. -Cedar On Sat, 7 Apr 2001, Josh Berkus wrote: > Folks (esp Jan, Tom & Michael): > > I have a search function I'm testing, which uses the EXECUTE function to > perform a dynamic set of string comparisons according to whcih criteria > the user passes along. Unfortunately, this requires me to triple-nest > my quotes .... and I can't seem to get it right. No matter how I play > with the function, it keeps blowing up due to "unterminated strings". > This happens even if I terminate the function short of the EXECUTE > statement. > > Can someone *please* give me some pointers? > > Function text: > *snip*
create function fn_search_orders ( INT4, VARCHAR, INT2, VARCHAR, DATE, VARCHAR, INT4, INT4, VARCHAR, VARCHAR, INT4 ) RETURNS int4 AS ' DECLARE v_client ALIAS for $1; v_clname ALIAS for $2; v_status ALIAS for $3; v_datesearch ALIAS for $4; v_start ALIAS for $5; v_address ALIAS for $6; v_contact ALIAS for $7; v_staff_usq ALIAS for $8; v_staff_name ALIAS for $9; v_temps ALIAS for $10; v_temp_usq ALIAS for $11; search_id INT4; query_string VARCHAR; where_string VARCHAR; search_count INT4; BEGIN search_id := NEXTVAL(''search_sq''); query_string := ''INSERT INTO searches ( search_sq, usq ) SELECT '' || CAST(search_id AS VARCHAR) || '', usq FROM sv_orders WHERE ''; where_string := ''''; IF v_client > 0 THEN where_string := '' AND client_usq = '' || CAST(v_client AS varchar); END IF; IF trim(v_clname) <> '''' THEN where_string := where_string || '' AND client_name ~* '''''''' || v_clname || ''''''; END IF; IF v_status <> 0 THEN where_string := where_string || '' AND status = '' || CAST(v_status AS VARCHAR); ELSE where_string := where_string || '' AND status > 0''; END IF; IF v_start > ''1950-01-01''::DATE THEN IF v_datesearch = ''BEFORE'' THEN where_string := where_string || '' AND start_date < '''''''' || to_char(v_start, ''YYYY-MM-DD'') || ''''''; ELSE where_string := where_string || '' AND start_date > '''''''' || to_char(v_start, ''YYYY-MM-DD'') || ''''''; END IF; END IF; IF trim(v_address) <> '''' THEN where_string := where_string || '' AND order_address ~* '''''''' || v_address || ''''''; END IF; IF v_staff_usq > 0 THEN where_string := where_string || '' AND resp_staff_usq = '' || CAST(v_staff_usq AS VARCHAR); END IF; IF trim(v_staff) <> '''' THEN where_string := where_string || '' AND staff_name ~* '''''''' || v_staff || ''''''; END IF; IF trim(v_contact) <> '''' THEN where_string := where_string || '' AND order_contact ~* '''''''' || v_contact || ''''''; END IF; IF trim(v_temps) <> '''' THEN where_string := where_string || '' AND list_temps ~* '''''''' || v_temps || ''''''; END IF; IF v_temp_usq > 0 THEN where_string := where_string || '' AND usq IN(SELECT order_usq FROM assignments WHERE candidate_usq = '' || CAST(v_temp_usq AS VARCHAR) || '')''; END IF; where_string := substr(where_string, 5); EXECUTE query_string || where_string; SELECT count(*) INTO search_count FROM searches WHERE search_sq = search_id; IF search_count > 0 THEN RETURN search_id; ELSE RETURN 0; END IF; END;' LANGUAGE 'plpgsql';
create function fn_search_orders ( INT4, VARCHAR, INT2, VARCHAR, DATE, VARCHAR, INT4, INT4, VARCHAR, VARCHAR, INT4 ) RETURNS int4 AS ' DECLARE v_client ALIAS for $1; v_clname ALIAS for $2; v_status ALIAS for $3; v_datesearch ALIAS for $4; v_start ALIAS for $5; v_address ALIAS for $6; v_contact ALIAS for $7; v_staff_usq ALIAS for $8; v_staff_name ALIAS for $9; v_temps ALIAS for $10; v_temp_usq ALIAS for $11; search_id INT4; query_string VARCHAR; where_string VARCHAR; search_count INT4; BEGIN search_id := NEXTVAL(''search_sq''); query_string := ''INSERT INTO searches ( search_sq, usq ) SELECT '' || CAST(search_id AS VARCHAR) || '', usq FROM sv_orders WHERE ''; where_string := ''''; IF v_client > 0 THEN where_string := '' AND client_usq = '' || CAST(v_client AS varchar); END IF; IF trim(v_clname) <> '''' THEN where_string := where_string || '' AND client_name ~* '''''' || v_clname || ''''''''; END IF; IF v_status <> 0 THEN where_string := where_string || '' AND status = '' || CAST(v_status AS VARCHAR); ELSE where_string := where_string || '' AND status > 0''; END IF; IF v_start > ''1950-01-01''::DATE THEN IF v_datesearch = ''BEFORE'' THEN where_string := where_string || '' AND start_date < '''''' || to_char(v_start, 'YYYY-MM-DD') || ''''''''; ELSE where_string := where_string || '' AND start_date > '''''' || to_char(v_start, 'YYYY-MM-DD') || ''''''''; END IF; END IF; IF trim(v_address) <> '''' THEN where_string := where_string || '' AND order_address ~* '''''' || v_address || ''''''''; END IF; IF v_staff_usq > 0 THEN where_string := where_string || '' AND resp_staff_usq = '' || CAST(v_staff_usq AS VARCHAR); END IF; IF trim(v_staff) <> '''' THEN where_string := where_string || '' AND staff_name ~* '''''' || v_staff || ''''''''; END IF; IF trim(v_contact) <> '''' THEN where_string := where_string || '' AND order_contact ~* '''''' || v_contact || ''''''''; END IF; IF trim(v_temps) <> '''' THEN where_string := where_string || '' AND list_temps ~* '''''' || v_temps || ''''''''; END IF; IF v_temp_usq > 0 THEN where_string := where_string || '' AND usq IN(SELECT order_usq FROM assignments WHERE candidate_usq = '' || CAST(v_temp_usq AS VARCHAR) || '')''; END IF; where_string := substr(where_string, 5); EXECUTE query_string || where_string; SELECT count(*) INTO search_count FROM searches WHERE search_sq = search_id; IF search_count > 0 THEN RETURN search_id; ELSE RETURN 0; END IF; END;' LANGUAGE 'plpgsql';
---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly