Questions tagged «plpgsql»

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

1
生成带有上下文的异常
PostgreSQL引发异常时,将出现“ CONTEXT”行,例如: ERROR: INSERT has more target COLUMNS than expressions LINE 3: ... ^ QUERY: INSERT INTO ... CONTEXT: PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement 但是当我抛出异常时,此行不存在。我没有找到如何添加它。 RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla'; 是否可以将此行添加到我的例外中?

3
如果两个过程尝试同时同时刷新材料视图,会发生什么?
根据文档: 同步刷新实例化视图,而不会锁定实例化视图上的并发选择。(...) ...其他内容... 即使使用此选项,一次也只能针对任何 一个实例化视图运行一次REFRESH。 我有一个功能,可以检查上次刷新时间以进行材料视图,如果超过60秒,它将刷新它。 但是,如果我尝试同时从两个单独的进程中刷新实例化视图,将会发生什么?他们会排队还是会引发错误? 有没有一种方法可以检测何时刷新了材料视图,因此避免触摸它? 目前,我在刷新之前将表记录填充(设置refreshing为true),然后false在过程完成时将其设置为。 EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id; 然后,每当我调用此过程时,我都会检查最新过程last_update及其refreshing值。如果refreshing为true,则不要尝试刷新实例化视图。 EXECUTE 'SELECT extract(epoch FROM now() - (last_update))::integer, refreshing FROM refresh_status ORDER BY …

3
PostgreSQL过程语言开销(plpython / plsql / pllua…)
我正在尝试以过程语言性能来查找有关PostgreSQL 用户定义函数的信息,以执行实时任务。 它们与内置函数相比如何? (在开销方面)Postgres如何调用/管理plpython vs plpgsql vs pllua函数(我对Postgres集成/上下文/数据传输方面感兴趣,而不对VM本身感兴趣)有什么区别吗? 上下文是否有很大的开销?我可以使用它进行实时数据映射吗(假设每秒1000个查询) 用plpgsql和其他pg /语言编写用户定义的函数有什么好处?在文档中,它们列举了优点,但是我认为它们适用于所有postgresql过程语言。 相关发现: 非典型用法的PL语言的速度 PostgreSQL函数语言性能:C与PL / PGSQL

2
如何在PL / pgSQL中获取手动引发的异常的异常上下文?
在Postgres中,我们使用以下代码获取异常的“堆栈跟踪”: EXCEPTION WHEN others THEN GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT; 对于“自然”异常,这很好用,但是如果我们使用 RAISE EXCEPTION 'This is an error!'; ...那么就没有堆栈跟踪。根据邮件列表条目,这可能是故意的,尽管我一生都无法弄清原因。这让我想找出引发异常的另一种方法,而不是使用RAISE。我只是想念一些明显的东西吗?有人对此有把戏吗?是否有我可以让Postgres抛出的异常,其中包含我选择的字符串,这样我不仅可以在错误消息中得到我的字符串,而且还可以得到完整的堆栈跟踪信息? 这是一个完整的示例: CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$ DECLARE v_error_stack text; BEGIN -- Comment this out to see how a "normal" exception will give you the stack trace RAISE …

1
错误:在无法接受集合的上下文中调用了set_valued函数。什么事啊
我在ubuntu 12.04上使用Postgresql 9.1。 克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return query,setof record等一系列的发电机到这个PLPGSQL功能: create or replace function compute_all_pair_by_craig(id_obj bigint) returns setof record as $$ begin return query select o.id, generate_series(0,o.value) from m_obj as o; end; $$ language plpgsql; 在执行过程中,我得到了错误: ERROR: set_valued function called in context that cannot accept a set 怎么了 ?与Craig相反,我告诉函数返回setof record。 我可以实现与Craig完全一样的工作,即通过定义类型create type pair_id_value as …

2
使用PL / pgSQL函数返回记录-加快查询速度
我有一个用Perl编写的非分叉游戏守护进程,该守护进程使用acync查询将玩家统计信息写入PostgreSQL 9.3数据库。但是,当我需要从数据库中读取某些内容时(例如,如果某个播放器被禁止或该播放器具有VIP状态),那么我将使用同步查询。 这使游戏停止片刻,直到从数据库中读取了该值。 我无法重写游戏守护进程以使用异步查询来读取值(我尝试过,但是需要太多更改),所以我的问题是:合并几个不相关的查询(当一个新玩家使用时,我需要进行查询)是否有意义连接)到1过程,我如何同时向我的Perl程序返回几个值? 我当前的所有查询都以玩家ID作为参数并返回1值: -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? select count(nullif(nice, false)) - count(nullif(nice, true)) as rep from pref_rep where id=? -- Is he or she a special VIP player? select vip > now() …

2
转换度量单位
寻找一种最合适的计量单位清单,列出以不同(但兼容)单位体积给出的物质。 单位换算表 单位转换表存储各种单位以及这些单位之间的关系: id unit coefficient parent_id 36 "microlitre" 0.0000000010000000000000000 37 37 "millilitre" 0.0000010000000000000000000 5 5 "centilitre" 0.0000100000000000000000000 18 18 "decilitre" 0.0001000000000000000000000 34 34 "litre" 0.0010000000000000000000000 19 19 "dekalitre" 0.0100000000000000000000000 29 29 "hectolitre" 0.1000000000000000000000000 33 33 "kilolitre" 1.0000000000000000000000000 35 35 "megalitre" 1000.0000000000000000000000 0 按系数排序显示parent_id链接将子单元与其数字上级链接。 可以使用以下方法在PostgreSQL中创建该表: CREATE TABLE unit_conversion ( id …

3
如何使用PLPGSQL确定当前search_path中是否存在表?
我正在为一个应用程序编写安装脚本,该脚本是另一个应用程序的附件,因此我想检查另一个应用程序的表是否存在。如果没有,我想给用户一个有用的错误。但是,我不知道哪种模式将保存表格。 DO LANGUAGE plpgsql $$ BEGIN PERFORM 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = current_setting('search_path') AND c.relname = 'foo' AND c.relkind = 'r'; -- not sure if I actually need this or not... IF NOT FOUND THEN RAISE 'This application depends on tables …

2
PostgreSQL Upsert在分区表上不起作用
有一个这样的表: CREATE TABLE aggregated_master ( "user" BIGINT, type TEXT, date TIMESTAMP, operations BIGINT, amount NUMERIC, PRIMARY KEY ( "user", type, date ) ); 该表是从中继承许多分区的主表。分区由DATE字段中的MONTH完成。例如:2017年8月的分区将是agg_201708,它的PK将是pk_agg_201708。在插入之前,通常有触发器将插入重定向到适当的分区。 事情是我想对这张表做一个UPSERT。DO CONFLICT部分不起作用。 代码首先是这样的 INSERT INTO aggregated_master (user, type, date, oeprations, amount) SELECT user, type, date, SUM(ops), SUM(amt) FROM ... WHERE ... GROUP BY USER, TYPE, DATE …

2
COMMIT是否可以在PostgreSQL 9.5的匿名plgpsql函数中工作?
我正在将大量大文件导入到许多表中,这些表将使用匿名plpgsql代码块内的循环进行分区$do$。 $do$ BEGIN FOR yyyy in 2012..2016 THEN EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$; END LOOP; END; $do$ LANGUAGE plpgsql 整个过程大约需要15个小时,我希望如果某个时刻出现导入错误,所有导入都不会回滚。 IIRC COMMIT在存储的函数中不起作用,因为整个函数被视为单个事务。 从文档中$do$ 将代码块视为没有参数的函数的主体,并返回void。它被解析并执行一次。 我假设这意味着整个$do$事务是一个事务,因此在该块内的提交将不起作用。我对么?

1
仅给出字段名称,如何访问NEW或OLD字段?
我正在写一个验证触发器。触发器必须验证数组的总和等于另一个字段。由于我有很多这种验证的实例,因此我想编写一个过程并创建多个触发器,每个触发器都有一组不同的要检查的字段。 例如,我具有以下架构: CREATE TABLE daily_reports( start_on date , show_id uuid , primary key(start_on, show_id) -- _graph are hourly values, while _count is total for the report , impressions_count bigint not null , impressions_graph bigint[] not null -- interactions_count, interactions_graph -- twitter_interactions_count, twitter_interactions_graph ); 验证必须确认impressions_count = sum(impressions_graph)。 我被卡住是因为我不知道如何NEW从plpgsql中动态访问字段: CREATE FUNCTION validate_sum_of_array_equals_other() …

1
在PL / pgSQL中声明表类型的变量
我想知道是否有一种方法可以在PL / pgSQL中声明类型表的变量来保存查询结果?例如,我如何表达这样的东西: q1 = select * from foo; q2 = select * from bar; for t1 in q1: for t2 in q2: -- do something with t1 and t2 我研究了return next构造,但似乎只能处理返回值。
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.