Questions tagged «plpgsql»

PL / pgSQL是PostgreSQL数据库系统的默认过程语言。关于PL / pgSQL的问题也应该标记为“ PostgreSQL”。


4
功能表现
由于MySQL的背景,存储过程的性能(较旧的文章)和可用性令人怀疑,我正在为我的公司评估PostgreSQL的新产品。 我想做的一件事是将一些应用程序逻辑移到存储过程中,因此我在这里要求在PostgreSQL(9.0)中使用函数时应做的DO和不做的(最佳实践),特别是关于性能陷阱。

3
在PostgreSQL中实现UPSERT的惯用方式
我已经阅读了UPSERTPostgreSQL中的不同实现,但是所有这些解决方案都相对较旧或相对陌生(例如,使用可写CTE)。 而且我根本不是psql专家,可以立即找出这些解决方案是否过时,因为它们是值得推荐的,还是(几乎所有它们都是)仅仅是玩具示例而不适合生产使用。 在PostgreSQL中实现UPSERT的最线程安全的方法是什么?

5
如何将数据(文件)插入PostgreSQL bytea列?
这个问题与bytea v。oid v。blobs v。大物体等无关。 我有一个包含主键integer字段和bytea字段的表。我想在该bytea字段中输入数据。据推测,这可以通过一种PL/语言来完成,PL/Python将来我可能会考虑这样做。 在仍在测试和试验中,我只想使用“标准” SQL语句从文件(服务器上)插入数据。我知道,只有在服务器上具有写权限的管理员才能以我想要的方式插入数据。我现在不担心这一点,因为用户bytea目前不会插入数据。我已经搜索了各种StackExchange网站,PostgreSQL档案库和Internet,但没有找到答案。 编辑: 这从2008年的讨论意味着什么,我想做的事情是不可能的。那么如何使用bytea字段? 编辑: 这从2005年类似的问题仍然没有答案。 解决:所提供的细节在这里上的psycopg网站,我用Python编写的解决方案提供了基础。也可以使用将二进制数据插入到bytea列中PL/Python。我不知道是否可以使用“纯” SQL。

6
“存储过程”和“存储函数”之间有什么区别?
因此,该问题的评论提到,PostgreSQL中的“存储过程”和“存储功能”略有不同。 该评论链接到Wikipedia文章,但其中一些似乎不适用(例如,可以在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(); 您创建了一个,FUNCTION但将其称为PROCEDURE。 那么这两者有什么区别?



1
有没有一种好的方法可以为postgres表中的每个记录运行触发器?
我有一个无法控制某些表设计的系统(通过Slony-I复制),所以我有一系列我们称为“影子表”的系统,在其中我从复制表中提取了一些信息,并将其存储在所需的已处理表单中,同时去除要忽略的记录。 现在,设置新副本后,我运行更新并将其值设置回自身(例如UPDATE tablename SET field=field),以强制触发器运行,但是其中一些表是数百万条记录,并且在增长,并且可能需要30分钟。(然后还有真空)。 有没有更好的方法来触发它,或者有某种方式编写一个函数以使其能够与传入的输入或NEW依赖于调用上下文一起工作?我不愿意保留两个不同的功能,因为我已经看到太多次更新了一个功能,而另一个没有更新。


2
用plpgsql编写的函数调用的Postgres查询计划
它使用的时候可能pgadmin还是plsql获得查询计划的搁置了内部执行SQL语句ü SER d efined ˚F油膏(UDF)使用EXPLAIN。那么,如何掌握UDF特定调用的查询计划?我看到UDF F()在pgadmin中抽象为一个操作。 我看过文档,但找不到任何东西。 目前,我正在提取语句并手动运行它们。但这对于大型查询并不会减少它。 例如,考虑下面的UDF。此UDF即使具有打印其查询字符串的能力,也不能与复制粘贴一起使用,因为它具有在本地创建的临时表,在粘贴和执行该表时不存在该临时表。 CREATE OR REPLACE FUNCTION get_paginated_search_results( forum_id_ INTEGER, query_ CHARACTER VARYING, from_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, to_date_ TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, in_categories_ INTEGER[] DEFAULT '{}') RETURNS SETOF post_result_entry AS $$ DECLARE join_string CHARACTER VARYING := ' '; from_where_date …

1
EXPLAIN ANALYZE不显示plpgsql函数内部查询的详细信息
我在PostgreSQL 9.3中使用PL / pgSQL函数,内部有几个复杂的查询: create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ... UPDATE …

2
触发器:将已删除的行移至存档表
我的restrictionsPostgreSQL数据库中有一个小表(约10行),每天都会删除和插入值。 我想要一个名为的表restrictions_deleted,将从中删除的每一行都restrictions将被自动存储。由于restrictions具有序列号,因此不会重复。 如何在PostgreSQL中编写这样的触发器?

1
使用USING子句命名函数参数和JOIN结果之间的冲突
鉴于当前Postgres 9.4中的设置(来自此相关问题): CREATE TABLE foo (ts, foo) AS VALUES (1, 'A') -- int, text , (7, 'B'); CREATE TABLE bar (ts, bar) AS VALUES (3, 'C') , (5, 'D') , (9, 'E'); 上一个问题还有一个SQL Fiddle。 我写了SELECT一个FULL JOIN以实现所引用问题的目的。简化: SELECT ts, f.foo, b.bar FROM foo f FULL JOIN bar b USING (ts); 根据规范,解决列的正确方法ts是不使用表限定。任一的输入值(f.ts或b.ts)可以是NULL。该USING子句会产生一些奇怪的情况:引入输入中实际上不存在的“输入”列。到目前为止,一切都很优雅。 …

2
PL / pgSQL中是否有一种简单的方法来检查查询是否未返回结果?
我目前正在尝试使用PL / pgSQL进行试验,并想知道是否存在一种更优雅的方法来执行以下操作: select c.data into data from doc c where c.doc_id = id and c.group_cur > group_cur order by c.id desc limit 1; EXCEPTION WHEN NO_DATA_FOUND THEN select c.data into data from doc c where c.doc_id = id and c.global_cur > global_cur order by c.id desc limit 1; EXCEPTION …

3
如何在PL / pgSQL中返回多行记录
我正在尝试使用RECORD数据类型返回多个记录,有没有一种方法可以追加到RECORD并在每次迭代中向此RECORD添加/附加新值。 也就是说,我想附加到,rec以便rec在循环结束时成为一组行,我可以在函数末尾返回。目前,我正在这样做- SELECT temp_table.col1, temp_table.col2, temp_table.col3 INTO rec FROM temp_table WHERE temp_table.col3 = false; 我的完整代码在这里: CREATE OR REPLACE FUNCTION validation() RETURNS RECORD AS $$ DECLARE rec RECORD; temp_row RECORD; BEGIN CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP; FOR temp_row IN SELECT * FROM staging.validation …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.