Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 自定义函数:将对象插入表_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 自定义函数:将对象插入表

Postgresql 自定义函数:将对象插入表,postgresql,plpgsql,Postgresql,Plpgsql,我的postgres数据库中有以下功能: create function my_schema.create_my_book(book my_schema.book)返回my_schema.book作为$$ 声明 v_book my_schema.book; 开始 在my_schema.book(title,language)中插入返回*到v_book中的值(book.title,book.language); 还书; 结束; $$language plpgsql volatile; 这样,我必

我的postgres数据库中有以下功能:

create function my_schema.create_my_book(book my_schema.book)返回my_schema.book作为$$
声明
v_book my_schema.book;
开始
在my_schema.book(title,language)中插入返回*到v_book中的值(book.title,book.language);
还书;
结束;
$$language plpgsql volatile;
这样,我必须键入所有列名(
title,language
)和值(
book.title,book.language
)。我的book表非常大,因此这将使我的代码大大膨胀,一旦我添加了一列,我也必须记住将它添加到这个函数中


有没有办法直接插入整个
book my_schema.book
对象?

是的,在这里。您甚至不需要plpgsql来实现这一点,纯sql也可以做到(并且工作得更快)

创建或替换函数my_schema.create_my_book(arg_book my_schema.book)
返回我的_schema.book作为
$$
插入my_schema.book选择arg_book.*返回*;
$$语言sql volatile;
我将参数的名称更改为
arg\u book
,以避免可能出现的歧义。由于
arg_book
的类型是
my_schema.book
这个简单的代码适应了表的变异并继续工作

解决id问题

创建或替换函数my_schema.create_my_book(arg_book my_schema.book)
返回我的_schema.book作为
$$
声明
v_book my_schema.book%行类型;
开始
arg_book.id:=nextval('the-id-sequence-name');
在my_schema.book中插入选择arg_book.*返回*到v_book;
还书;
结束;
$$language plpgsql volatile;

这与初始函数非常接近,只是动态的。

这将不幸地导致此错误:“错误:列“id”中的null值违反了非null约束”没错。您可以将具有
NEW.id:=nextval('the-sequence-name')
的before-insert触发器添加到
my\u架构。创建我的书
以解决此问题。我将用另一个选项更新我的答案。