Postgres - ERROR: syntax error at or near "IF" - postgresql

I have a function and I need to do different select based on inputid. so I have added the condition as below.
....
begin
IF(iv_binrocess = 1 AND IsNull(iv_binno,'') != '') THEN
...//some process here
END If;
...
End
When I run the function, I got the error "
ERROR: syntax error at or near "IF"
I referred many sites and tutorials, nothing helped me.
Can anyone help me to fix this issue?
Thanks

WAG, since you deleted most of the important information: You're trying to create a function with a PL/pgsql body, but declaring it SQL.
craig=> CREATE FUNCTION test() RETURNS void LANGUAGE sql AS
$$ BEGIN IF TRUE THEN PERFORM 1; END IF; END; $$ ;
ERROR: syntax error at or near "IF"
LINE 1: ...TION test() RETURNS void LANGUAGE sql AS $$ BEGIN IF TRUE TH...
Declare PL/PgSQL functions as LANGUAGE plpgsql.
If you instead want to use an SQL function, use a CASE expression instead of IF.
CREATE FUNCTION test2() RETURNS integer LANGUAGE sql
AS $$ SELECT CASE WHEN TRUE THEN 1 ELSE 0 END; $$;
(Note, I haven't bothered to format these readably. Don't write functions all in one line like this in real code.)

Related

PostgreSQL using NO_DATA_FOUND exception in a sored Procedure

When I try to run a PostgreSQL stored procedure including the "STRICT" option and a record variable (rec) as I try to save (run the create statement) I get the following error:
ERROR: syntax error at or near "rec"
LINE 14: INTO STRICT rec
I' am following the guidelines stated on the official documentation https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW
where the only reference missing is that this can or can't be used inside a function or a stored procedure. I guess there should be a reasonable answer to this issue I couldn't found. I was able to succeed running an equivalent code inside a Do block, so it seams there is some incompatibility declaring a record type variable and functions.
This is the function code I was running:
CREATE OR REPLACE FUNCTION test_nodata()
RETURNS TABLE(id int, active boolean)
LANGUAGE plpgsql
AS $$
DECLARE
rec record;
tab VARCHAR ='text_maintenance_news';
BEGIN
RETURN QUERY
SELECT tm.id, tm.active
INTO STRICT rec
FROM text_maintenance_news tm
WHERE tm.active
LIMIT 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE 'Query from % has no data', tab;
END;
$$
As mentioned at the official documents, postgreSQL doesn't consider no data as an error but as a warning that the programmer must handle. Main reason to include the STRICT option.
Do block code (It works!) and result:
DO
LANGUAGE plpgsql
$$
DECLARE
rec record;
tab varchar = 'text_maintenance_news';
BEGIN
SELECT *
INTO STRICT rec
FROM text_maintenance_news
WHERE active
LIMIT 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE 'Query from % return no data', tab;
END;
$$
ERROR: Query from text_maintenance_news return no data
CONTEXT: PL/pgSQL function inline_code_block line 13 at RAISE
SQL state: P0001

Postgresql update query syntax error in plpgsql function

I have to create a update procedure, so i created a function and given only below query
CREATE FUNCTION public.testf()
RETURNS boolean
LANGUAGE 'plpgsql'
AS $BODY$begin
update tt pp
set status = 'Ok'
return true;
end;$BODY$;
ALTER FUNCTION public.testf()
OWNER TO postgres;
returns error
ERROR: syntax error at or near "UPDATE" LINE 5: AS $BODY$UPDATE
return type I have given is int4range
What I am doing wrong
Please help
THanks
Pulling out my crystal ball, I see:
You created the function with LANGUAGE plpgsql.
You didn't surround the function body with BEGIN ... END;.
If your function is just a single SQL statement, use LANGUAGE sql.
Else, use the block-centered PL/pgSQL syntax properly.
You are missing an ; to end the UPDATE statement.
CREATE FUNCTION public.testf()
RETURNS boolean
LANGUAGE plpgsql
AS $BODY$
begin
update tt pp
set status = 'Ok'; --<< here
return true;
end;
$BODY$;

Check function with IF statement in POSTGRESQL

I have 10 functions, all 10 return '1' if the function has no errors and '0' if function has errors. I want to create another function witch calls all this functions and which checks it out if the functions return 0 or 1. After that, I want to run this function in linux crontab and the function's output (some text from if conditions) to go in a log file.
I'm not sure if I can check this functions like this. Thanks for your time!
CREATE OR REPLACE FUNCTION public.test_al1()
RETURNS text
LANGUAGE 'plpgsql'
COST 100
AS $BODY$
DECLARE
BEGIN
select public.test();
if (select public.test()) = 1 then
RAISE NOTICE 'No errors'
else
RAISE NOTICE 'Errors'
end if;
END
$BODY$;
You were missing a return point for your query and there were also a few ; missing. I'm not really sure what you want to achieve with this function, since you declared the function would return TEXT and there is no RETURN statement.
One option would be to not return anything and use RAISE as you've been doing - keep in mind that the intention of RAISE (without INFO, EXCEPTION, etc.) alone is rather to report error messages:
CREATE OR REPLACE FUNCTION public.test_al1() RETURNS VOID LANGUAGE plpgsql
AS $BODY$
BEGIN
IF public.test() = 1 THEN
RAISE 'Errors';
ELSE
RAISE 'No errors';
END IF;
END
$BODY$;
.. or alternatively you can simplify it a bit by returning the message as TEXT in the RETURN clause.
CREATE OR REPLACE FUNCTION public.test_al1() RETURNS TEXT LANGUAGE plpgsql
AS $BODY$
DECLARE res TEXT DEFAULT 'No errors';
BEGIN
IF public.test() = 1 THEN
res := 'Errors';
END IF;
RETURN res;
END
$BODY$;
Further reading: CREATE FUNCTION

PostgreSQL PL/pgSQL syntax error with FOREACH loop

I'm trying to learn PL/pgSQL by writing some simple programs. To learn about FOREACH loop, I wrote the following:
CREATE OR REPLACE FUNCTION test(int[]) RETURNS void AS $$
DECLARE
window INT;
BEGIN
FOREACH window IN ARRAY $1
LOOP
EXECUTE 'SELECT $1' USING window;
END LOOP;
$$ LANGUAGE plpgsql;
SELECT test(ARRAY [30,60]);
I expect that this code snippet would first print 30 and then 60. However, I get the following error.
psql:loop.sql:11: ERROR: syntax error at end of input
LINE 7: EXECUTE 'SELECT $1' USING window;
^
psql:loop.sql:13: ERROR: function test(integer[]) does not exist
LINE 1: SELECT test(ARRAY [30,60]);
^
HINT: No function matches the given name and argument types. You might need
to add explicit type casts.
So the function definition has a syntax error, but I don't understand what the error is and how to fix it. I'd appreciate any help. Thanks!
Your function is declared as returns void so you can't return anything from it. If you want to return multiple values, you need to use returns setof integer
But it has more problems than that.
you should give your parameter a name (not an error, but good coding style)
to return a value from a function you need to use return. To return multiple values (because of returns setof) you need to use return next
there is no need for a dynamic SQL to return a value, you can return the variable directly.
Also not not an error, but: window is a keyword, I wouldn't use a variable with that name.
Applying all that, your function should look like this:
CREATE OR REPLACE FUNCTION test(p_input int[])
RETURNS setof integer
as
$$
DECLARE
l_value INT;
BEGIN
FOREACH l_value IN ARRAY p_input
LOOP
return next l_value;
END LOOP;
end;
$$
LANGUAGE plpgsql;
I am not sure if you are aware, but there is already a built-in function which achieves the same thing: unnest().

Function's final statement must be SELECT or INSERT UPDATE DELETE RETURNING

CREATE FUNCTION retrieve_add_friends(user_id text[])
RETURNS SETOF user_rows AS
$BODY$
BEGIN
FOR user_rows IN EXECUTE SELECT * FROM user_details where user_id= $1
LOOP
FOR user_friends IN EXECUTE SELECT * FROM user_add_friends where user_id= $1
LOOP
IF user_rows.user_id!=user_friends.user_friend_id THEN
RETURN NEXT user_rows;
END IF;
END LOOP;
RETURN;
END LOOP;
RETURN;
END
$BODY$
language plpgsql VOLATILE;
When I execute this I get following error:
ERROR: return type mismatch in function declared to return user_details
DETAIL: Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING.
CONTEXT: SQL function "retrieve_add_friends"
Can anyone help me out with this?
The function displayed is a PL/pgSQL function.
You are calling a different function, an SQL function, obviously (for which the error msg would make sense):
SQL function "retrieve_add_friends"
Same function name, but different arguments (and possibly in a different database schema). Are you aware of function overloading and its implications?
Related:
ERROR: function addgeometrycolumn is not unique
For a quick diagnosis:
SELECT oid::regprocedure AS function_signature, *
FROM pg_proc
WHERE proname = 'retrieve_add_friends';
All that aside, the function displayed has multiple errors and can be replaced with plain SELECT.