根据参数中的值列表更新和插入记录
Update and insert record based on list of value in the parameter
我正在使用 postgresql 9.3。
我想创建一个函数来更新我的 table (flag='9') 并使用参数中指定的 rfidnumber 插入新记录 (flag='0')。
此参数可能有多个值,由 space 分隔(即 11 22 33 44)
CREATE OR REPLACE FUNCTION public.fcreate_rfid (
znumber varchar
)
RETURNS boolean AS
$body$
BEGIN
--update old record which has the same rfid number and flag='9' if exists
update tblrfid set flag='9' where flag='0' and rfidnumber in (znumber);
-- generate new record
insert into tblrfid(tanggal, flag, rfidnumber)
select localtimestamp, '0', regexp_split_to_table(znumber, ' ');
return true;
END;
$body$
LANGUAGE 'plpgsql';
当我调用此函数时使用:
select fcreate_rfid('11 22 33 44');
该函数更新旧记录失败,插入新记录成功
帮我解决这个问题。我知道问题出在更新命令上,但我只是不知道如何更正它。
您不能这样做 - znumber
是 VARCHAR,而不是元素列表。所以 IN
运算符在这里没用 - 列表中只有 1 个元素,它是整个字符串 znumber
,而不是它的 space 分隔元素。
我不确定下面的代码是否有效,但它应该能为您的研究指明方向:
UPDATE tblrfid SET flag='9'
WHERE flag='0' AND rfidnumber = ANY (string_to_array(znumber,' '));
我正在使用 postgresql 9.3。
我想创建一个函数来更新我的 table (flag='9') 并使用参数中指定的 rfidnumber 插入新记录 (flag='0')。
此参数可能有多个值,由 space 分隔(即 11 22 33 44)
CREATE OR REPLACE FUNCTION public.fcreate_rfid (
znumber varchar
)
RETURNS boolean AS
$body$
BEGIN
--update old record which has the same rfid number and flag='9' if exists
update tblrfid set flag='9' where flag='0' and rfidnumber in (znumber);
-- generate new record
insert into tblrfid(tanggal, flag, rfidnumber)
select localtimestamp, '0', regexp_split_to_table(znumber, ' ');
return true;
END;
$body$
LANGUAGE 'plpgsql';
当我调用此函数时使用:
select fcreate_rfid('11 22 33 44');
该函数更新旧记录失败,插入新记录成功
帮我解决这个问题。我知道问题出在更新命令上,但我只是不知道如何更正它。
您不能这样做 - znumber
是 VARCHAR,而不是元素列表。所以 IN
运算符在这里没用 - 列表中只有 1 个元素,它是整个字符串 znumber
,而不是它的 space 分隔元素。
我不确定下面的代码是否有效,但它应该能为您的研究指明方向:
UPDATE tblrfid SET flag='9'
WHERE flag='0' AND rfidnumber = ANY (string_to_array(znumber,' '));