相关疑难解决方法(0)

功能表现

来自 MySQL 背景,其中存储过程性能(旧文章)可用性值得怀疑,我正在评估 PostgreSQL 为我公司的新产品。

我想做的一件事是将一些应用程序逻辑移到存储过程中,所以我在这里询问有关在 PostgreSQL (9.0) 中使用函数的 DO 和 DON'T(最佳实践),特别是关于性能陷阱。

postgresql best-practices plpgsql

63
推荐指数
4
解决办法
4万
查看次数

“存储过程”和“存储函数”有什么区别?

所以这个问题的评论提到,PostgreSQL 中的“存储过程”和“存储功能”略有不同。

评论链接到维基百科文章,但其中一些似乎并不适用(例如,它们可以在SELECT声明中使用)。

语法本身似乎有点混乱:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Run Code Online (Sandbox Code Playgroud)

您创建了一个FUNCTION但将其称为PROCEDURE.

那么这两者有什么区别呢?

postgresql stored-procedures plpgsql

47
推荐指数
6
解决办法
5万
查看次数

什么时候使用存储过程/用户定义函数?

我对 SP(存储过程)和 UDF(用户定义函数)的使用感到困惑。通常,也可以在数据库之外的程序中编写代码。

是否有任何一般建议来决定何时使用它们?

postgresql stored-procedures functions

4
推荐指数
1
解决办法
9419
查看次数

在 plpgsql 的存储过程中使用参数

我正在尝试返回重叠多边形的数量。问题是它抱怨我的“$1”标志:

Error is "SQL state: 42601", syntax error at "$1". 
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我在这里完全是初学者,除了用符号引用参数之外,我无法在网上找到解决方案$

CREATE OR REPLACE FUNCTION any_overlap (x text) 
RETURNS integer AS $$
DECLARE amount INTEGER;
BEGIN
    SELECT COUNT(*) INTO amount FROM $1 a
    INNER JOIN $1 b ON 
    (a.polygon && b.polygon AND ST_Relate(a.polygon, b.polygon, '2********'))
    WHERE a.ctid != b.ctid;
    RETURN amount AS id;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql syntax dynamic-sql plpgsql postgis

1
推荐指数
1
解决办法
2792
查看次数