在Postgresql函数的工作原理上遇到了一些误解。任务是检查我的数据库中是否已经存在某些id
。如果是这样-从现有记录返回一些数据。如果没有,请插入一些数据并返回所有内容。
CREATE OR REPLACE FUNCTION test(_id varchar, _data varchar[]) RETURNS varchar[] AS $$
BEGIN
IF EXISTS (SELECT 1 FROM my_table WHERE id = _id) THEN
SELECT * FROM my_table WHERE id = _id;
ELSE
INSERT INTO my_table (id, filename, size) VALUES (_data) RETURNING *;
END IF;
END
$$ LANGUAGE plpgsql;
选择返回错误:ERROR: invalid input syntax for integer: "id123"
SELECT test('id123', ARRAY['id123', 'filename', 123456]);
任何帮助将不胜感激。
答案 0 :(得分:0)
将各个表列的多个参数作为数组元素传递不是一个好主意。您最好使用Composite Type作为参数。这可以帮助您甚至将多行数据传递给函数,如this示例所示
如果您坚持使用数组元素,那么不能简单地在@GetMapping("/getimage/{path}")
public void adminDownloadProductPicture(@PathVariable("path") String path,
HttpServletResponse response) throws IOException {
File file = new File(this.uploadingDir + path); // or you can use Paths.get(this.uploadingDir + path); instead
Files.copy(file.toPath(), response.getOutputStream());
response.setContentType("image/jpeg"); // your content type here
}
中使用它们,必须使用索引对其进行引用
VALUES()
INSERT INTO my_table (id, filename, size)
VALUES (_data[1],_data[2],_data[3]::int );
的另一个问题是它不是从函数返回的。它只是返回查询结果。如果您纯粹是想使用RETURNING *;
,则可以使用with子句。
假设表的定义是这样的,
RETURNING
您可以将函数的返回类型写为 Table "public.my_table"
Column | Type | Collation | Nullable | Default
----------+-------------------+-----------+----------+---------
id | character varying | | |
filename | text | | |
size | integer | | |
TABLE