Postgres ошибка синтаксиса примерное положение if

As Johannes already says: you are mixing regular SQL with PL/pgSQL, the stored procedure language. The link that Johannes provides should explain the concept of stored procedures to you.

I take it you’re doing this as a script? Executing one statement after another? I’m afraid you can only do what you want to do inside a Stored Procedure, or Function, as you might call it. This is because when you are executing statements in this way, every statement stands on its own with no relation or information regarding the other statements.

Furthermore you can look at the following link for more information on how to use IF … THEN … ELSE … END IF; conditionals inside plpgsql: link.


EDIT:

I don’t know if ROLLBACK is allowed at that point (because each stored procedure is already in its own transaction), but you must be able to figure that out for yourself using the extensive documentation @ http://www.postgresql.org. Here’s a sample function with your code in it, also demonstrating some other syntax:

CREATE OR REPLACE FUNCTION public.test()
RETURNS integer AS
$$
DECLARE
tempvar integer;

BEGIN    
     tempvar := 1;

     INSERT INTO movements (from, to, import) VALUES ('mary', 'steve', 600);
     UPDATE users SET credit = credit - 600 WHERE name = 'mary';
     UPDATE users SET credit = credit + 600 WHERE name = 'steve';

     --here comes the problem!
     IF (SELECT credit FROM users WHERE name = 'mary') < 0 THEN
        ROLLBACK;
     END IF;

     RETURN tempvar;
END
$$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

However, if you are really going this road, I recommend using a GUI DB manager. It’s easier for learning all this.

I am new to postgres and I am working on an assignment of mine. I had to create a table with only 1 column and, then I was given this statement to run in on pgadmin III:

BEGIN;
INSERT INTO mytable VALUES (1);
SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (2);
ROLLBACK TO SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (3);
SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (4);
INSERT INTO mytable VALUES (5);
SAVEPOINT savepoint3;
SELECT * FROM mytable;
--NOTE: You need to run this IF statement as PGScript 
--(button next to the normal run button)
IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4)
BEGIN
      RELEASE SAVEPOINT savepoint2;
END
ELSE
BEGIN
      INSERT INTO mytable VALUES(6);
END
--Run the next steps normally
SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (7);
RELEASE SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (8);
ROLLBACK TO savepoint2;
COMMIT;

when I run this I get this error: syntax error at or near «IF»

I have already take a look at this 38.6.2. Conditionals38.6.2. Conditionals , I dont understand this very well, Do I need to change the query to have

IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4) THEN 
BEGiN 

and then when it ends I should end it with:

END IF

Why there is an error after all??

asked Jan 6, 2014 at 19:03

S. N's user avatar

2

IF and other PL/pgSQL features are only available inside PL/pgSQL functions. You need to wrap your code in a function if you want to use IF. If you’re using 9.0+ then you can do use DO to write an inline function:

do $$
begin
  -- code goes here
end
$$

If you’re using an earlier version of PostgreSQL then you’ll have to write a named function which contains your code and then execute that function.

answered Jan 6, 2014 at 19:28

mu is too short's user avatar

mu is too shortmu is too short

421k69 gold badges826 silver badges789 bronze badges

1

Not the answer for the OP, but possibly the answer for some who end up here (like myself):
If you DECLARE variables within the BEGIN-END block, you will get the same syntax error.

So this is wrong:

DO $$
BEGIN
  DECLARE my_var VARCHAR(50) := 'foo';
  IF my_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 

This should fix it:

DO $$
DECLARE my_var VARCHAR(50) := 'foo';
BEGIN
  IF my_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 

answered Jan 2, 2020 at 13:51

nozem's user avatar

nozemnozem

41710 silver badges10 bronze badges

1

I try to create a sp that checks if a job that didn’t started already exists and if not creates a new one. It should return the id of the job.
For now I have the following code:

CREATE OR REPLACE FUNCTION 
public.create_category_training_job(category_id integer) RETURNS integer AS
$BODY$
-- check if a job for this category is already queued and not started
DECLARE job_id Integer := (SELECT id FROM category_training_jobs WHERE startdate IS NULL);
-- if a not started job is present return the id it
IF job_id IS NOT NULL THEN
    RETURN job_id;
-- if id is not present create a new job and return its id
ELSE    
    (INSERT INTO 
        category_training_jobs (category_id, submissiondate, startdate, enddate)
     VALUES
        (category_id, NOW(), NULL, NULL)
     RETURNING id);
END IF;
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 100;

For some rease I get «ERROR: syntax error at or near «IF»
LINE 6: IF job_id IS NOT NULL THEN»

As far as I know IS NOT NULL should be a boolean expression, so it should be a valid expression. Am I missing something?

asked Feb 28, 2016 at 13:45

Johnny000's user avatar

0

You are missing a BEGIN and END around your body:

REPLACE FUNCTION create_category_training_job(category_id integer) 
  RETURNS integer 
AS
$BODY$
-- check if a job for this category is already queued and not started
DECLARE 
  job_id Integer := (SELECT id FROM category_training_jobs WHERE startdate IS NULL);
BEGIN --<<<< HERE

  -- if a not started job is present return the id it
  IF job_id IS NOT NULL THEN
      RETURN job_id;
  -- if id is not present create a new job and return its id
  ELSE    
      INSERT INTO 
          category_training_jobs (category_id, submissiondate, startdate, enddate)
       VALUES
          (category_id, NOW(), NULL, NULL)
       RETURNING id;
  END IF;

END; --<<<< AND HERE
$BODY$
LANGUAGE plpgsql;

The parentheses around your insert are useless noise as well, you should remove them.

answered Feb 28, 2016 at 14:04

a_horse_with_no_name's user avatar

Yamis

2 / 1 / 4

Регистрация: 21.04.2018

Сообщений: 204

1

29.01.2019, 22:18. Показов 4085. Ответов 2

Метки нет (Все метки)


Вот запрос

SQL
1
2
3
4
5
6
7
SELECT name_meducament AS "Назва медикамента",Name_rechovenu AS "Назва речовини",
IF (SELECT Tup_rech FROM Xim_slad WHERE Tup_rech= 'діюча')>0 THEN  (SELECT COUNT(*) FROM Xim_slad WHERE Tup_rech='діюча')
ELSE                                        
IF (SELECT Tup_rech FROM Xim_slad WHERE Tup_rech  = 'допоміжна')>0 THEN (SELECT COUNT(*) FROM Xim_slad WHERE Tup_rech='допоміжна');
END IF;
FROM Meducamenu JOIN Xim_slad ON Meducamenu.idMeducamenu=Xim_slad.Meducamenu_idMeducamenu
GROUP BY idXim_slad,Tup_rech;

вот ошибка
ОШИБКА: ошибка синтаксиса (примерное положение: «if»)
LINE 1: if (SELECT Tup_rech FROM Xim_slad where Tup_rech= ‘діюча’)>0..
Возможно нужно убрать этот «>0» и что-то другое написать но я это уже пробывал.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Модератор

4186 / 3026 / 576

Регистрация: 21.01.2011

Сообщений: 13,099

30.01.2019, 09:27

2

А что здесь проверяет «>0»? Если число строк, то для их подсчета есть COUNT

0

1184 / 914 / 367

Регистрация: 02.09.2012

Сообщений: 2,785

30.01.2019, 12:21

3

IF запрещен на уровне SELECT. IF — это оператор процедурного языка.
На SQL нужно использовать CASE … END.

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

30.01.2019, 12:21

Помогаю со студенческими работами здесь

Ошибка в запросе
Всем доброго времени суток! Помогите пожалуйста кто знает) Пытаюсь составить запрос, который будет…

Ошибка в запросе
Нужно получить: список производителей товара с указанием суммы продаж их товара, отсортированный по…

ошибка в запросе
подсобите плиз:

$query = &quot;INSERT INTO $dir_table_db (dir_name, dir_name_eng, ref, image,…

Ошибка в запросе
Появилась задача написать web-приложеньеце php+mssql, решил работать с sqlsrv( mssql что-то…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

3

Я новичок в PostgreSQL, и у меня уже есть первая проблема..

Я написал код, чтобы понять, как работают транзакции, следуя пошаговому руководству.

чтобы сделать его коротким, Я создал 2 таблицы, пользователь и движения: в первом из них есть столбцы имя, электронная почта и кредит, во втором-Столбцы от, до, импорт.

Итак, я пытался так:

BEGIN;
INSERT INTO movements (from, to, import) VALUES ('mary', 'steve', 600);
UPDATE users SET credit = credit - 600 WHERE name = 'mary';
UPDATE users SET credit = credit + 600 WHERE name = 'steve';
--here comes the problem!
IF (SELECT credit FROM users WHERE name = 'mary') < 0 THEN
 ROLLBACK;
END IF
COMMIT;

Я всегда получаю ошибку:

ошибка: синтаксическая ошибка при или около «IF»

где я ошибаюсь?

P. S.: Не сосредоточиться на примере функциональности, это просто испытание для меня, чтобы понять сделок.. а теперь пункт IF…

5 ответов


Как уже говорит Йоханнес: вы смешиваете обычный SQL с PL / pgSQL, языком хранимых процедур. Ссылка, которую предоставляет Johannes, должна объяснить вам концепцию хранимых процедур.

Я так понимаю, вы делаете это как сценарий? Выполнение одного оператора за другим? Боюсь, вы можете делать только то, что хотите, внутри хранимой процедуры или функции, как вы ее называете. Это связано с тем, что при выполнении операторов таким образом каждый оператор стоит на своем собственный, не имеющий никакого отношения или информации относительно других заявлений.

кроме того, вы можете посмотреть на следующую ссылку для получения дополнительной информации о том, как использовать IF … ЗАТЕМ… ЕЩЕ… END IF; conditionals внутри plpgsql:ссылке.


EDIT:

Я не знаю, разрешен ли откат в этот момент (потому что каждая хранимая процедура уже находится в своей собственной транзакции), но вы должны быть в состоянии понять это для себя, используя обширная документация @ http://www.postgresql.org. Вот пример функции с вашим кодом, также демонстрирующий другой синтаксис:

CREATE OR REPLACE FUNCTION public.test()
RETURNS integer AS
$$
DECLARE
tempvar integer;

BEGIN    
     tempvar := 1;

     INSERT INTO movements (from, to, import) VALUES ('mary', 'steve', 600);
     UPDATE users SET credit = credit - 600 WHERE name = 'mary';
     UPDATE users SET credit = credit + 600 WHERE name = 'steve';

     --here comes the problem!
     IF (SELECT credit FROM users WHERE name = 'mary') < 0 THEN
        ROLLBACK;
     END IF;

     RETURN tempvar;
END
$$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

однако, если вы действительно идете по этому пути, я рекомендую использовать менеджер БД GUI. Все это легче усвоить.


вы, кажется, используете plain SQL но IF оператор является частью PL/pgSQL процедурный язык, который является частью программы.


вы можете попробовать изменить часть IF, из:

IF (SELECT credit FROM users WHERE name = 'mary') < 0 THEN
 ROLLBACK;
END IF

to

SELECT SUM(credit) INTO v_credit FROM users WHERE name = 'mary';
IF (v_credit) < 0 THEN
 ROLLBACK;
END IF

предполагая, что v_credit-это переменная, определенная ранее.
IMHO, Postgre предполагает, что запрос SELECT возвращает более одного результата, хотя вы уверены, что он уникален. Поэтому я думаю, что вы можете попытаться сначала назначить значение переменной.


Если вы хотите избежать, если вы можете переписать свой код как:

BEGIN;

    INSERT INTO movements (from, to, import)    
    SELECT 'mary', 'steve', CASE credit < 600 WHEN TRUE THEN 0 ELSE 600 END;

    UPDATE users SET credit = credit - CASE credit < 600 WHEN TRUE THEN 0 ELSE 600 END    
    WHERE name = 'mary';

    UPDATE users u SET u.credit = u.credit + CASE v.credit < 600 WHEN TRUE THEN 0 ELSE 600 END    
    FROM users v    
    WHERE u.name = 'steve' and v.name = 'mary'

COMMIT;

Да, это глупо :) .


подобно Microsoft SQL и T/SQL, вы должны иметь возможность смешивать обычный SQL с PL / pgSQL, если они находятся в правильной последовательности. Вот пример, где последовательность имеет значение в смешанном SQL / PL, хранящемся proc:

вы не можете обернуть условные операторы внутри курсора-вы должны поставить курсор внутри условного оператора. Если вы сделаете последовательность наоборот, вы получите ту же ошибку, что и раньше, ‘ ERROR: syntax error at или near «Если»:

CREATE OR REPLACE FUNCTION getSubsystemFaultListCount(_bunoid integer, _subsystem text, _starttime timestamp without time zone, _stoptime timestamp without time zone)
      RETURNS refcursor AS
    $BODY$
    DECLARE mycurs refcursor;
    BEGIN 
        IF _subsystem = 'ALL' THEN
            OPEN mycurs FOR
            SELECT  count(*), fs_fault.faultcode, fs_fault.downloadtime
            FROM    fs_fault
            WHERE   fs_fault.bunoid = _bunoid
                AND fs_fault.statusid IN(2, 4)
                AND fs_fault.downloadtime BETWEEN _starttime AND _stoptime
            GROUP BY fs_fault.faultcode, fs_fault.downloadtime;
            RETURN mycurs;
        ELSE
            OPEN mycurs FOR
            SELECT  count(*), fs_fault.faultcode, fs_fault.downloadtime
            FROM    fs_fault
            WHERE   fs_fault.bunoid = _bunoid
                AND fs_fault.subsystemid 
                    IN(SELECT id FROM fs_subsystem WHERE type = _subsystem)
                AND fs_fault.statusid IN(2, 4)
                AND fs_fault.downloadtime BETWEEN _starttime AND _stoptime
            GROUP BY fs_fault.faultcode, fs_fault.downloadtime;
            RETURN mycurs;
        END IF;

    END;
    $BODY$

Я новичок в PostGresSQL; эта функция является просто примером.


Syntax errors are quite common while coding.

But, things go for a toss when it results in website errors.

PostgreSQL error 42601 also occurs due to syntax errors in the database queries.

At Bobcares, we often get requests from PostgreSQL users to fix errors as part of our Server Management Services.

Today, let’s check PostgreSQL error in detail and see how our Support Engineers fix it for the customers.

What causes error 42601 in PostgreSQL?

PostgreSQL is an advanced database engine. It is popular for its extensive features and ability to handle complex database situations.

Applications like Instagram, Facebook, Apple, etc rely on the PostgreSQL database.

But what causes error 42601?

PostgreSQL error codes consist of five characters. The first two characters denote the class of errors. And the remaining three characters indicate a specific condition within that class.

Here, 42 in 42601 represent the class “Syntax Error or Access Rule Violation“.

In short, this error mainly occurs due to the syntax errors in the queries executed. A typical error shows up as:

Here, the syntax error has occurred in position 119 near the value “parents” in the query.

How we fix the error?

Now let’s see how our PostgreSQL engineers resolve this error efficiently.

Recently, one of our customers contacted us with this error. He tried to execute the following code,

CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH m_ty_person AS (return query execute sql)
select name, count(*) from m_ty_person where name like '%a%' group by name
union
select name, count(*) from m_ty_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;

But, this ended up in PostgreSQL error 42601. And he got the following error message,

ERROR: syntax error at or near "return"
LINE 5: WITH m_ty_person AS (return query execute sql)

Our PostgreSQL Engineers checked the issue and found out the syntax error. The statement in Line 5 was a mix of plain and dynamic SQL. In general, the PostgreSQL query should be either fully dynamic or plain. Therefore, we changed the code as,

RETURN QUERY EXECUTE '
WITH m_ty_person AS (' || sql || $x$)
SELECT name, count(*)::int FROM m_ty_person WHERE name LIKE '%a%' GROUP BY name
UNION
SELECT name, count(*)::int FROM m_ty_person WHERE gender = 1 GROUP BY name$x$;

This resolved the error 42601, and the code worked fine.

[Need more assistance to solve PostgreSQL error 42601?- We’ll help you.]

Conclusion

In short, PostgreSQL error 42601 occurs due to the syntax errors in the code. Today, in this write-up, we have discussed how our Support Engineers fixed this error for our customers.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

GET STARTED

var google_conversion_label = «owonCMyG5nEQ0aD71QM»;

Синтаксическая ошибка в или около «IF» PostgreSQL

Я пытаюсь использовать подзапрос в своем коде, но это дает мне ошибку. Я нашел много решений, но они все еще не работают:

Вот мой код:

BEGIN;
IF (SELECT COUNT(*) FROM table1 WHERE Z = 'aaaaa') = 0

    THEN
    INSERT INTO table2 (X, Y) VALUES ("abc", 7)

END IF;
END;

и ошибка:

ERROR:  syntax error at or near "IF"
LINE 2: IF (SELECT COUNT(*) FROM table1 WHERE Path = 'aaaaa') = 0
        ^


********** Error **********

ERROR: syntax error at or near "IF"
SQL state: 42601
Character: 8

Не могли бы вы помочь мне?

1 ответы

Опустить точку с запятой после «НАЧАЛО»? Это если это тело функции plpgsql.

Если это сценарий psql, IF оператор должен быть передан plpgsql для выполнения, поэтому необходимо ввести DO $$ ... $$ построить.

Или, конечно, вы можете провести рефакторинг следующим образом:

INSERT INTO table2(x,y)
    SELECT 'abc', 7
    WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE z = 'aaaaa')

Создан 04 сен.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

postgresql
if-statement

or задайте свой вопрос.

I am trying to write an sql function on PostgreSQL, but I have an error with the ‘IF’:

ERROR: Syntax error at or near "IF"
LINE 11: IF Type = 's' THEN

I can’t understand the syntax error.
(The Function without the IF work correctly)

My SQL Code:

CREATE OR REPLACE FUNCTION public.add_activity(IDactivity smallint,Date_Start date, Data_End date, 
Type character varying,Name character varying DEFAULT NULL::character varying,
Typology character varying DEFAULT NULL::character varying, Client smallint DEFAULT NULL::smallint)
RETURNS void
LANGUAGE 'sql'
AS $BODY$

INSERT INTO public."Activity" 
VALUES(IDactivity, Date_Start, Data_End, Type, Name);

IF Type = 's' THEN
INSERT INTO public."Service" 
VALUES(IDactivity, Typology, Client); 

END IF;
$BODY$;

Thank you!

>Solution :

IF is not implemented in the sql language but it is in the plpgsql language, see the manual.

You can either replace LANGUAGE sql by LANGUAGE plpgsql and then add BEGIN and END in the function body :

CREATE OR REPLACE FUNCTION public.add_activity(IDactivity smallint,Date_Start date, Data_End date, 
Type character varying,Name character varying DEFAULT NULL::character varying,
Typology character varying DEFAULT NULL::character varying, Client smallint DEFAULT NULL::smallint)
RETURNS void
LANGUAGE plpgsql
AS $BODY$
BEGIN
INSERT INTO public."Activity" 
VALUES(IDactivity, Date_Start, Data_End, Type, Name);

IF Type = 's' THEN
INSERT INTO public."Service" 
VALUES(IDactivity, Typology, Client); 
END IF;

END ;
$BODY$

Or you can change your code to stay in the sql language :

CREATE OR REPLACE FUNCTION public.add_activity(IDactivity smallint,Date_Start date, Data_End date, 
Type character varying,Name character varying DEFAULT NULL::character varying,
Typology character varying DEFAULT NULL::character varying, Client smallint DEFAULT NULL::smallint)
RETURNS void
LANGUAGE sql
AS $BODY$

INSERT INTO public."Activity" 
VALUES(IDactivity, Date_Start, Data_End, Type, Name);

INSERT INTO public."Service"
SELECT IDactivity, Typology, Client
WHERE Type = 's' ;

$BODY$

Yamis

2 / 1 / 4

Регистрация: 21.04.2018

Сообщений: 204

1

29.01.2019, 22:18. Показов 4910. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Вот запрос

SQL
1
2
3
4
5
6
7
SELECT name_meducament AS "Назва медикамента",Name_rechovenu AS "Назва речовини",
IF (SELECT Tup_rech FROM Xim_slad WHERE Tup_rech= 'діюча')>0 THEN  (SELECT COUNT(*) FROM Xim_slad WHERE Tup_rech='діюча')
ELSE                                        
IF (SELECT Tup_rech FROM Xim_slad WHERE Tup_rech  = 'допоміжна')>0 THEN (SELECT COUNT(*) FROM Xim_slad WHERE Tup_rech='допоміжна');
END IF;
FROM Meducamenu JOIN Xim_slad ON Meducamenu.idMeducamenu=Xim_slad.Meducamenu_idMeducamenu
GROUP BY idXim_slad,Tup_rech;

вот ошибка
ОШИБКА: ошибка синтаксиса (примерное положение: «if»)
LINE 1: if (SELECT Tup_rech FROM Xim_slad where Tup_rech= ‘діюча’)>0..
Возможно нужно убрать этот «>0» и что-то другое написать но я это уже пробывал.



0



Модератор

4204 / 3044 / 581

Регистрация: 21.01.2011

Сообщений: 13,184

30.01.2019, 09:27

2

А что здесь проверяет «>0»? Если число строк, то для их подсчета есть COUNT



0



1213 / 938 / 373

Регистрация: 02.09.2012

Сообщений: 2,860

30.01.2019, 12:21

3

IF запрещен на уровне SELECT. IF — это оператор процедурного языка.
На SQL нужно использовать CASE … END.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

30.01.2019, 12:21

Помогаю со студенческими работами здесь

Ошибка в запросе
Всем доброго времени суток! Помогите пожалуйста кто знает) Пытаюсь составить запрос, который будет…

Ошибка в запросе
Нужно получить: список производителей товара с указанием суммы продаж их товара, отсортированный по…

ошибка в запросе
подсобите плиз:

$query = &quot;INSERT INTO $dir_table_db (dir_name, dir_name_eng, ref, image,…

Ошибка в запросе
Появилась задача написать web-приложеньеце php+mssql, решил работать с sqlsrv( mssql что-то…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

3

Изучаю if запросы в PostgreSQL.

Не могу понять, почему ругается на ошибку в запросе:

IF SELECT age FROM peoples where id = 2 > 1 THEN
SELECT 1+1
END IF;

Пишет: «примерное положение ошибки If»


  • Вопрос задан

    более трёх лет назад

  • 120 просмотров

Пригласить эксперта

DECLARE v_age INT;
...
SELECT INTO v_age age FROM peoples where id = 2;
IF v_age > 1 THEN
    SELECT 1 + 1;
END IF;

Или

PERFORM age FROM peoples where id = 2;
IF FOUND THEN
    SELECT 1 + 1;
END IF;

Ну и с EXISTS можно придумать


  • Показать ещё
    Загружается…

09 июн. 2023, в 01:21

10000 руб./за проект

09 июн. 2023, в 01:06

50000 руб./за проект

09 июн. 2023, в 00:36

1000 руб./за проект

Минуточку внимания

I try to create a sp that checks if a job that didn’t started already exists and if not creates a new one. It should return the id of the job.
For now I have the following code:

CREATE OR REPLACE FUNCTION 
public.create_category_training_job(category_id integer) RETURNS integer AS
$BODY$
-- check if a job for this category is already queued and not started
DECLARE job_id Integer := (SELECT id FROM category_training_jobs WHERE startdate IS NULL);
-- if a not started job is present return the id it
IF job_id IS NOT NULL THEN
    RETURN job_id;
-- if id is not present create a new job and return its id
ELSE    
    (INSERT INTO 
        category_training_jobs (category_id, submissiondate, startdate, enddate)
     VALUES
        (category_id, NOW(), NULL, NULL)
     RETURNING id);
END IF;
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 100;

For some rease I get «ERROR: syntax error at or near «IF»
LINE 6: IF job_id IS NOT NULL THEN»

As far as I know IS NOT NULL should be a boolean expression, so it should be a valid expression. Am I missing something?

Понравилась статья? Поделить с друзьями:
  • Postgres ошибка роль не существует
  • Postgres ошибка role does not exist
  • Postgre ошибка при создании информационной базы
  • Postfix ошибка relay access denied
  • Postfix ошибка 451 temporary lookup failure