2015-04-29 4 views
0
CREATE OR REPLACE FUNCTION public.create_user(_name TEXT, _pass TEXT, _iconid INTEGER) 
RETURNS user_info 
LANGUAGE sql 
AS $$ 
DECLARE 
    _newid INTEGER; 
BEGIN 
    INSERT INTO users(name, password, iconid) VALUES (_name, crypt(_pass, gen_salt('bf')), _iconid); 
    SELECT _newid = currval(pg_get_serial_sequence('users', 'id')); 


    SELECT u.id, u.name, u.rating, t.name, i.path, i.name FROM users u 
    LEFT OUTER JOIN usertypes t ON t.id = u.typeid 
    LEFT OUTER JOIN usericons i ON i.id = u.iconid 
    WHERE u.id = _newid; 
END 
$$; 

я получаю:Почему функция Postgres не правильная?

ERROR: syntax error at or near "INTEGER" 
Line 6: _newid INTEGER; 
       ^

Я уверен, что есть что-то я отсутствую, но это было действительно расстраивает до сих пор, потому что инструменты некачественные по сравнению с почти все другой крупной БД - MySQL, SQL Server, Oracle и т. д.

ответ

3

Why isn't this Postgres function correct?

Поскольку он не содержит действительного SQL. Похоже, что он содержит код plpgsql. Попробуйте изменить язык:

LANGUAGE plpgsql 
+0

Теперь функция создает, но я получаю эту ошибку при выполнении: 'выберите * из public.create_user ('DerpDerp5678', 'пароль', 1); ОШИБКА: запрос не имеет адресата для данных результата СОВЕТ. Если вы хотите отменить результаты SELECT, вместо этого используйте PERFORM. КОНТЕКСТ: PL/pgSQL function create_user (текст, текст, целое число) строка 6 в операторе SQL – MonkRocker

+0

Отметьте это как ответ, но - не имеет значения на данный момент. Меня тошнит от борьбы с дерьмовыми инструментами. Вернемся к mySQL, где таинственные задачи с короткими задачами, такие как EDITING A FUNCTION, не скрываются в пыльных углах. – MonkRocker

+0

Вам нужен отдельный вопрос для этой ошибки. Хотя это, вероятно, будет дублировать. – Flimzy

Смежные вопросы