我正在尝试将一个字符串从Web应用程序的用户输入转换为varchar。我想更改给定某个ID(主键)的列之一的值,并且列名是我作为varchar投射的。
CREATE OR REPLACE FUNCTION changeQuantities(productID varchar, warehouseID int, change int)
RETURNS void AS $$
BEGIN
EXECUTE format('UPDATE warehouses SET CAST(%I AS VARCHAR) = %s WHERE warehouseID = %s', productID, change, warehouseID)
USING change, warehouseID;
END;
$$ LANGUAGE plpgsql;
'productID'是列名,'change'是新值,'warehouseID'是表的主键。 '仓库'就是桌子。这是我收到的错误:
SELECT changeQuantities('bg412',1,100);
ERROR: syntax error at or near "CAST"
LINE 1: UPDATE warehouses SET CAST(bg412 AS VARCHAR) = 100 WHERE war...
^
QUERY: UPDATE warehouses SET CAST(bg412 AS VARCHAR) = 100 WHERE warehouseID = 1
CONTEXT: PL/pgSQL function changequantities(character varying,integer,integer) line 3 at EXECUTE statement
我有另一个函数,就像它在转换列名时使用SELECT语句一样,它工作得很好。我可以在SET之后再投出一些东西吗?我没有在这个特殊情况下找到任何东西,所以我要么被羞辱,要么我会帮助别人解决类似的问题。谢谢你的帮助。
答案 0 :(得分:0)
您不能在作业的左侧使用cast()
- 并且您不需要它,因为已知列的数据类型。如果有的话,您需要将赋值的右手侧转换为左侧的数据类型。
假设bg412
是列名,您需要:
CREATE OR REPLACE FUNCTION changeQuantities(productID varchar, warehouseID int, change int)
RETURNS void AS $$
BEGIN
EXECUTE format('UPDATE warehouses SET %I = %s WHERE warehouseID = %s', productID, change, warehouseID)
USING change, warehouseID;
END;
$$ LANGUAGE plpgsql;
无关,但是:使用产品的ID作为表格中的列名称似乎是一种可怕的设计。如果你拥有一百万种产品,你会怎么做?