PostgreSQL:批量创建几个pgplsql程序

时间:2010-12-20 15:22:01

标签: php postgresql

我有一个带有几个类似SQL表的PHP脚本(只有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 的丑陋。

在CentOS 5.5 Linux下使用PostgreSQL 8.4.5和PHP 5.1.6

谢谢!亚历

1 个答案:

答案 0 :(得分:0)

好吧,我没有看到您在%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();
}