我有一个带有几个类似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
谢谢!亚历
答案 0 :(得分:0)
好吧,我没有看到您在%s
的字符串中的任何位置使用sprintf
,但如果您想在同一个sprintf
字符串中多次使用同一个变量,您可以使用%1$s
作为第一个参数,如下所示:
sprintf('%1$s %1$s', 'hubba') // hubba hubba
编辑:这是链接:http://php.net/manual/en/function.sprintf.php。当然,这不是非常PostgreSpecific,但我希望它是你正在寻找的。 p>
编辑:那么,在你的情况下,你会这样做:
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();
}