在PostgreSQL中,就其目的,优点和缺点而言,预备语句与SQL或PL/pgSQL函数之间有什么区别?我们什么时候使用?
在这个非常简单的示例中,它们的作用相同吗,正确吗?
CREATE TABLE foo (id INT, name VARCHAR(80)); CREATE FUNCTION myfunc1(INT, VARCHAR(80)) RETURNS void AS ' INSERT INTO foo VALUES ($1, $2); ' LANGUAGE SQL; SELECT myfunc1(3, 'ben'); CREATE FUNCTION myfunc2(INT, VARCHAR(80)) RETURNS void AS ' BEGIN INSERT INTO foo VALUES ($1, $2); END' LANGUAGE plpgsql; SELECT myfunc2(3, 'ben'); PREPARE fooplan (INT, VARCHAR(80)) AS INSERT INTO foo VALUES($1, $2); PREPARE EXECUTE fooplan(3, 'ben');
所有三个“工作原理相同”,因为它们执行简单的SQL语句:
INSERT INTO foo VALUES (3, 'ben');
预处理语句仅适用于 _单个_预处理SQL语句(顾名思义)。而且只有DML命令。手册:
任何SELECT,INSERT,UPDATE,DELETE,或VALUES语句。
SELECT
INSERT
UPDATE
DELETE
VALUES
函数可以包含任意数量的语句。DML 和 DDL。只有SQL for SQL函数。在PL / pgSQL中加上一些非SQL过程元素。
准备好的语句仅在同一会话内可见,并在会话结束时消失,而这些函数将保留并对所有人可见-仍然仅对具有EXECUTE特权的用户可用。
EXECUTE
准备好的语句的开销最少。(相差不大。)
SQL函数是三个不能保存查询计划(仅凭其自身)的唯一函数。在此处阅读有关PL / pgSQL函数中计划缓存的详细信息。
当在较大的查询中使用SQL函数时,它也是唯一可以 内联的 函数。(但不带有INSERT。)