PostgreSQL: создание нескольких процедур pgplsql в пакете - PullRequest
0 голосов
/ 20 декабря 2010

У меня есть PHP-скрипт с несколькими похожими таблицами SQL (меняется только 1 столбец):

define('SQL_TABLES', '
create table hide_id (
        ID       varchar(20) references quincytrack,
        USERNAME varchar(20) not null,
        UPDATED  timestamp default current_timestamp
);
create table hide_name (
        NAME     varchar(20) not null,
        USERNAME varchar(20) not null,
        UPDATED  timestamp default current_timestamp
);
create table hide_category (
        CATEGORY varchar(120) not null,
        USERNAME varchar(20) not null,
        UPDATED  timestamp default current_timestamp
);
create table hide_appsversion (
        APPSVERSION varchar(30) not null,
        USERNAME varchar(20) not null,
        UPDATED  timestamp default current_timestamp
);
create table hide_osversion (
        OSVERSION varchar(30) not null,
        USERNAME varchar(20) not null,
        UPDATED  timestamp default current_timestamp
);

И я хотел бы создать процедуру upsert для каждой из них:

define('SQL_PROCS', '
create or replace function hide_id_upsert(
        _ID       varchar,
        _USERNAME varchar
        ) returns void as $BODY$
        begin
                update hide_id set
                        ID       = _ID,
                        USERNAME = _USERNAME,
                        UPDATED  = current_timestamp
                where ID = _ID;

                if not found then
                        insert into hide_id (
                                ID,
                                USERNAME
                        ) values (
                                _ID,
                                _USERNAME
                        );
                end if;
        end;
$BODY$ language plpgsql;
');

Интересно, смогу ли я сделать это в пакете средствами PgPlSQL или PHP?Что-то вроде:

$columns = array('ID', 'NAME', 'CATEGORY', 'APPSVERSION', 'OSVERSION');
foreach ($columns as $key) {
   $sth = $pg->prepare(sprintf(SQL_PROCS_TEMPLATE, $key, $key, ...);
   $sth->execute();
}

, но без вышеуказанного уродства необходимости указывать $ key много раз.

Использование PostgreSQL 8.4.5 и PHP 5.1.6 под CentOS5.5 Linux

Спасибо!Alex

1 Ответ

0 голосов
/ 20 декабря 2010

Ну, я не вижу, чтобы вы использовали %s где-либо в строке для вашего sprintf, но если вы хотите использовать одну и ту же переменную несколько раз в одной и той же строке sprintf, вы можете использовать %1$sдля первого аргумента, например:

sprintf('%1$s %1$s', 'hubba') // hubba hubba

Редактировать: вот ссылка: http://php.net/manual/en/function.sprintf.php. Конечно, это не очень PostgreSpecific, но я надеюсь, что это то, что вы ищете.

РЕДАКТИРОВАТЬ: Итак, в вашем случае, вы бы сделали:

define('SQL_PROCS', '
create or replace function %1$s_upsert(
        _ID       varchar,
        _USERNAME varchar
        ) returns void as $BODY$
        begin
                update %1$s set
                        ID       = _ID,
                        %2$s = _%2$s,
                        UPDATED  = current_timestamp
                where ID = _ID;

                if not found then
                        insert into %1$s (
                                ID,
                                %2$s
                        ) values (
                                _ID,
                                _%2$s
                        );
                end if;
        end;
$BODY$ language plpgsql;
');

$columns = array('ID', 'NAME', 'CATEGORY', 'APPSVERSION', 'OSVERSION');
foreach ($columns as $key) {
   $sth = $pg->prepare(sprintf(SQL_PROCS, 'hide_' . strtolower($key), $key));
   $sth->execute();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...