Функции в PostgreSQL

rean1mator
Дата: 06.01.2015 22:07:50
Здравствуйте!

Сегодня начал изучать функции в PostgreSQL. Написал свою первую тестовую функцию, опираясь на примеры и тд. Всё запустилось, но остались вопросы. Если кому-то будет не трудно, просветите меня, пожалуйста, в следующем:
  • Как я понял, вместо блока DECLARE имена переменным можно задавать прямо в параметрах (как в php), так ли это ?
  • Что означает $$ перед BEGIN ?
  • Что такое found в конструкции IF found THEN ?
  • Как понять конструкцию EXCEPTION WHEN unique_violation THEN и что она делает ?


    И последний вопрос, который напрямую не касается SQL, но, может быть кто-то в курсе:
  • Как сохранить готовый код функции через PgAdmin III? Знаю, что там есть определенная форма для создания функций, но там мало что понятно
  • tadmin
    Дата: 07.01.2015 14:19:11
    Ответы на все ваши вопросы можно найти в документации.

  • Как я понял, вместо блока DECLARE имена переменным можно задавать прямо в параметрах (как в php), так ли это ?
  • Без примера вас трудно понять. Можно объявить переменные в Declare, можно в заголовке функции (in & out параметры сигнатуре вызова)

  • Что означает $$ перед BEGIN ?
  • http://www.postgresql.org/docs/9.4/interactive/plpgsql-structure.html

  • Что такое found в конструкции IF found THEN ?
  • 40.5.5. Obtaining the Result Status
    http://www.postgresql.org/docs/9.4/static/plpgsql-statements.html

  • Как понять конструкцию EXCEPTION WHEN unique_violation THEN и что она делает ?
  • 40.6.6. Trapping Errors
    http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html

    И последний вопрос, который напрямую не касается SQL, но, может быть кто-то в курсе:
  • Как сохранить готовый код функции через PgAdmin III? Знаю, что там есть определенная форма для создания функций, но там мало что понятно
  • определение функции - это обычный скрипт, который можно выполнить в pgAdmin Query Tool. Ctrl+E
    На мой взгляд, спец. формы для создания функций неудобны. Не только в pgAdmin.
    rean1mator
    Дата: 07.01.2015 19:05:22
    функцию написал такую:
    автор
    CREATE OR REPLACE FUNCTION InsertUpdate (text,text,text,text)
    RETURNS text AS
    $$


    DECLARE
    usr_nm ALIAS FOR $1;
    pass ALIAS FOR $2;
    nm ALIAS FOR $3;
    famil ALIAS FOR $4;
    result text;

    BEGIN

    UPDATE joins.users SET user_name=usr_nm, "password"=pass, imya=nm, familiya=famil WHERE user_name=usr_nm;

    IF found THEN
    result := 'Сработал Update';
    RETURN result;
    END IF;
    INSERT INTO joins.users (user_name, "password", imya, familiya) VALUES (usr_nm, pass, nm, famil);
    result := 'Сработал Insert';
    RETURN result;

    END;

    $$
    LANGUAGE plpgsql;


    но после выполнения в pgAdmin Query Tool, функция не сохраняется в схеме, просто pgAdmin пишет, что выполнение успешно. Подскажите, пожалуйста, что я не так делаю?
    Ы
    Дата: 07.01.2015 20:45:30
    rean1mator
    функцию написал … но после выполнения в pgAdmin Query Tool, функция не сохраняется в схеме

    Что вас заставляет так думать?
    rean1mator
    Дата: 07.01.2015 23:49:37
    Ы, например, то, что я её не вижу в схеме, сколько бы я не пытался нажимать "Выполнить" и обновлять содержимое схемы
    Ы
    Дата: 08.01.2015 01:28:14
    rean1mator,

    в вашем случае успешное выполнение сигнализирует о том, что функция создана. Ищите в схеме public в разделе «Функции». Имя будет в нижнем регистре.
    rean1mator
    Дата: 08.01.2015 10:58:47
    Спасибо, нашел :)

    Понял свою ошибку. Я при создании функции не написал, в какой схеме её создать.