"LANGUAGE 'plpgsql' VOLATILE "是什么意思?
当我在postgres数据库中创建或更新函数或过程时,我会在功能末尾看到LANGUAGE 'plpgsql' VOLATILE. 这是什么意思,其目的是什么? 解决方案 来自 挥发性表明该功能值甚至在 单个表扫描,因此无法进行优化.相对较少 从这个意义上讲,数据库函数是波动的.一些例子是 random(),currval(),timeofday().但是请注意,任何具有的功能 副作用必须易变,即使其结果完全 可预测的,以防止呼叫被优化;一个例子是 setVal(). 其他解决方案 尤其是,LANGUAGE 'plpgsql' VOLATILE表示某人没有获得备忘录. LANGUAGE plpgsql VOLATILE 渎职可能会导致令人困惑的错误.请参阅: postgresgressql程序语言" C"找不到 /li> 关于功能波动:
0 2023-11-25
编程技术问答社区
如何创建不返回任何东西的函数
我想用pl/pgsql编写功能. 我正在使用 Postgresenterprise Manager v3 并使用Shell来制作功能,但是在Shell中,我必须定义返回类型.如果我不定义返回类型,我将无法创建函数. 如何创建一个函数而无需返回结果,即创建新表的函数? 解决方案 使用RETURNS void喜欢下面: CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$ #variable_conflict use_variable DECLARE curtime timestamp := now(); BEGIN UPDATE users SET last_modified = curtime, comment = comment WHERE users.id = id; END; $$ LANGUAGE
0 2023-11-25
编程技术问答社区
返回无效的PostgreSQL函数
用PL/pgSQL或SQL编写的函数可以定义为RETURNS void.我最近偶然发现了结果差异. 考虑以下演示: CREATE OR REPLACE FUNCTION f_sql() RETURNS void LANGUAGE sql AS 'SELECT NULL::void'; -- = "do nothing", no special meaning CREATE OR REPLACE FUNCTION f_plpgsql() RETURNS void LANGUAGE plpgsql AS $func$ BEGIN NULL; -- = "do nothing", no special meaning END; $func$; 函数f_sql()使用RETURNS void RETURNS void中SELECT(如last命令)的唯一可能方法.我之所以使用它,是因为它是用于此测试目的的最简单方法 - 例如,任何其他功能(例如UPDATE
0 2023-11-25
编程技术问答社区
为PostgreSQL表创建别名
我有一个称为作业的表.我希望能够使用sistions.column或"作业". 我知道这不是您通常会做的.我需要能够做到这一点,以在短时间内提供向后的兼容性. 我们有一个iOS应用程序,目前对DB进行了直接的PostgreSQL查询.我们正在更新所有应用程序以使用API​​.在构建API的过程中,开发人员决定更改表的名称,因为我们(愚蠢地)认为我们不需要向后兼容. 现在,v1.0和API都需要能够写入此表,这样我以后不必做一些Voodoo即以后传输/组合数据... 我们正在使用Ruby在Rails上进行API. 解决方案 使用Postgres 9.3以下内容应该足够: 创建视图作业为"从分配"; 的选择 * 它之所以起作用,是因为简单的视图自动更新(请参阅DOCS ). P> 其他解决方案 在Postgres 9.3或更高版本中,简单的自动"可更新". 手动: 简单的视图自动可更新:系统将允许 INSERT,UPDATE和DELETE在视图中使用
0 2023-11-19
编程技术问答社区
如何在jOOQ中执行返回JSON类型的PL/pgSQL用户定义函数的SELECT查询?
我在找到正确的方法将我的用户定义函数在PL/PGSQL中施放到JOOQ代码中有问题.我在PL/PGSQL中使用的用户定义功能返回JSON类型,我需要以某种方式将其调整/铸造在JOOQ中.我已经搜索了示例,但没有发现. 以防万一,这是我在PL/PGSQL中的用户定义功能: create or replace function public.get_order_by_order_id(o_id bigint) returns json as $BODY$ DECLARE total_oi_price double precision; book_price double precision; total_price double precision; oi_amount integer; order_items json; item_recs RECORD; book_json json; single_order_
0 2023-11-18
编程技术问答社区
将多维数组作为参数传递给Postgresql函数
我正在尝试使用PostgreSQL数据库维护PHP应用程序.在某一时刻,调用了一个存储过程,可以说function_x和内部function_x,function_y被调用; function_y通过一个名为parameter_1的变量,parameter_1的定义为: parameter_1 numeric[][3] := {}; 我正在尝试直接在命令行(或pgadmin)上执行Select函数_y,但是我在将空数组传递到功能中时遇到问题.根据select function_y(581, 'CPN-00000000001-0000', 'TPN-00000000001-0001', 100, 2013, variadic arr := array[]); 但是我有一个错误: ERROR: cannot determine type of empty array 我尝试了不同的方法,但没有任何作用.如何将多维数组作为查询中的参数传递? 解决方案 1)您
2 2023-11-13
编程技术问答社区
复制具有动态列名的记录
我有两个在Postgresql 9.3中具有不同列的表格: CREATE TABLE person1( NAME TEXT NOT NULL, AGE INT NOT NULL ); CREATE TABLE person2( NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); INSERT INTO person2 (Name, Age, ADDRESS, SALARY) VALUES ('Piotr', 20, 'London', 80); 我想将记录从person2复制到person1,但是列名称可以在程序中更改,因此我想在程序中选择联合列名称.因此,我创建一个包含列名称相
6 2023-11-13
编程技术问答社区
在PostgreSQL中替代MySQL'的变量?
我们经常使用快速的一次性SQL文件在现有数据库中插入或更新数据. SQL通常由开发人员编写,在开发系统上进行了测试,然后在生产DB中以psql -U dbuser dbname . 进口. a(琐碎的)示例可能看起来像: INSERT INTO employees ( company_id, name, position, created_by, last_modified_by ) VALUES ( (SELECT id FROM companies WHERE name = 'Acme Fellowship'), 'Frodo Baggins', 'Ring bearer', (SELECT id FROM users WHERE login = 'admin'), (SELECT id FROM users WHERE login = 'admin') ), (
0 2023-11-13
编程技术问答社区
如何在plpgsql中使用记录类型变量?
如何使用存储在同一存储函数中的另一个查询中的记录类型变量中?我使用Postgres 9.4.4. 带有这样的桌子: create table test (id int, tags text[]); insert into test values (1,'{a,b,c}'), (2,'{c,d,e}'); 我写了一个函数(简化),如下: CREATE OR REPLACE FUNCTION func(_tbl regclass) RETURNS TABLE (t TEXT[], e TEXT[]) LANGUAGE plpgsql AS $$ DECLARE t RECORD; c INT; BEGIN EXECUTE format('SELECT id, tags FROM %s', _tbl) INTO t; SELECT count(*) FROM t INTO c; RAISE NOTICE
0 2023-11-13
编程技术问答社区
在Postgres 9.0以上版本中用PL/pgSQL对表进行循环操作
我想循环遍历所有桌子,以计数每个表中的行.以下查询会给我带来一个错误: DO $$ DECLARE tables CURSOR FOR SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg_%' ORDER BY tablename; tablename varchar(100); nbRow int; BEGIN FOR tablename IN tables LOOP EXECUTE 'SELECT count(*) FROM ' || tablename INTO nbRow; -- Do something with nbRow END LOOP; END$$; 错误: ERROR: syntax error at or near ")" LINE 1: SELECT coun
2 2023-11-13
编程技术问答社区
我可以让一个plpgsql函数在不使用变量的情况下返回一个整数吗?
类似的东西: CREATE OR REPLACE FUNCTION get(param_id integer) RETURNS integer AS $BODY$ BEGIN SELECT col1 FROM TABLE WHERE id = param_id; END; $BODY$ LANGUAGE plpgsql; 我想避开DECLARE只是为此. 解决方案 是的,您可以.有多种方法. 1)RETURN (SELECT ...) CREATE OR REPLACE FUNCTION get_1(_param_id integer) RETURNS integer LANGUAGE plpgsql AS $func$ BEGIN RETURN _param_id; -- Or: -- RETURN (SELECT col1 FROM tbl WHERE id = _param_id); END $func$; 2)使用OUT或I
2 2023-11-13
编程技术问答社区
在plpgsql函数中定义表和列名作为参数?
这一定很简单,但是我正在迈出第一步,我找不到任何可行的东西... 我想创建一个可以修改表和/或列的函数,我找不到将表和列指定为函数中参数的正确方法. 类似: CREATE OR REPLACE FUNCTION foo(t table) RETURNS void AS $$ BEGIN alter table t add column c1 varchar(20); alter table t add column c2 varchar(20); alter table t add column c3 varchar(20); alter table t add column c4 varchar(20); END; $$ LANGUAGE PLPGSQL; select foo(some_table) 在另一种情况下,我想拥有一个从某个表中改变特定列的函数: CREATE OR REPLACE FUNCTION foo(t tabl
2 2023-11-13
编程技术问答社区
PL/pgSQL:访问自定义类型的数组中的一个元素的字段
我已经定义了一种自定义类型: create type pg_temp.MYTYPE as (f1 int, f2 text); 然后,在函数或块中,我声明了这样的类型数组: declare ax MYTYPE[]; 我可以通过熟悉的语法ax[1].f1访问元素,但仅用于阅读. 当我使用相同的语法来设置字段时,会得到语法错误. create type pg_temp.MYTYPE as (f1 int, f2 text); do $$ declare x MYTYPE; declare ax MYTYPE[]; declare f int; begin x.f1 = 10; x.f2 = 'hello'; --assigning an element: OK ax[1] = x; --reading an element's field: OK f = ax[1].f1; --writing
0 2023-11-13
编程技术问答社区
整数类型输入语法无效: 执行函数时,"(2,2) "为复合数据类型
begin; create type public.ltree as (a int, b int); create table public.parent_tree(parent_id int,l_tree ltree); insert into public.parent_tree values(1,(2,2)),(2,(1,2)),(3, (1,28)); commit; 试图在此答案中复制解决方案: 用于复合类型的函数: CREATE OR REPLACE FUNCTION public.get_parent_ltree (_parent_id int, tbl_name regclass , OUT _l_tree ltree) LANGUAGE plpgsql AS $func$ BEGIN EXECUTE format('SELECT l_tree FROM %s WHERE parent_id = $1', tbl_nam
0 2023-11-13
编程技术问答社区
SELECT INTO有一个以上的属性
此指令有效: SELECT INTO unsolvedNodes array_agg(DISTINCT idDestination) FROM road WHERE idOrigin = ANY(solvedNodes) AND NOT (idDestination = ANY(solvedNodes)); 但是我想这样使用某种方式: SELECT INTO unsolvedNodes array_agg(DISTINCT idDestination), lengths array_agg(length) FROM road WHERE idOrigin = ANY(solvedNodes) AND NOT (idDestination = ANY(solvedNodes)); 如何仅使用一个SELECT INTO指令设置多个变量? 解决方案 在 pl/pgsql 中,您可以直接SELECT INTO 直接与您喜欢一样多.您刚刚向后进行语法: SELE
0 2023-11-13
编程技术问答社区
自动完成字段的类似UTF-8字符串
背景 用户可以输入名称,并且系统应匹配文本,即使用户输入或数据库字段包含重音(UTF-8)字符.这是使用pg_trgm模块. 问题 代码类似于以下内容: SELECT t.label FROM the_table t WHERE label % 'fil' ORDER BY similarity( t.label, 'fil' ) DESC 当用户键入fil时,查询匹配filbert,但filé powder不匹配. (由于重音角色?) 失败解决方案#1 我尝试实现 unAccent 功能并将查询重写为: SELECT t.label FROM the_table t WHERE unaccent( label ) % unaccent( 'fil' ) ORDER BY similarity( unaccent( t.label ), unacc
0 2023-11-11
编程技术问答社区
如何在postgres函数中使用EXECUTE FORMAT ... USING
CREATE OR REPLACE FUNCTION dummytest_insert_trigger() RETURNS trigger AS $BODY$ DECLARE v_partition_name VARCHAR(32); BEGIN IF NEW.datetime IS NOT NULL THEN v_partition_name := 'dummyTest'; EXECUTE format('INSERT INTO %I VALUES ($1,$2)',v_partition_name)using NEW.id,NEW.datetime; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; 我试图使用以下方式插入: INSERT INT
2 2023-11-11
编程技术问答社区
Postgres从一个动态的sql字符串中创建一个本地临时表(在提交时删除)。
我在postgres udf中生成了一个查询字符串,我想在临时表中将其结果放在temp表中(我正在使用LIMIT和OFFSET),我不想加入其他ttable,只是最终在查询计划中的限制运算符时最终将数据切碎.我尝试使用以下语句创建临时表. CREATE LOCAL TEMP TABLE query_result ON COMMIT DROP AS EXECUTE query_string_; 但我收到以下错误通知: ********** Error ********** ERROR: prepared statement "query_string_" does not exist SQL state: 26000 Context: SQL statement "CREATE LOCAL TEMP TABLE query_result ON COMMIT DROP AS EXECUTE query_string_" PL/pgSQL function "search_p
6 2023-11-10
编程技术问答社区
PLpgSQL函数用于在给定的表中查找只有NULL值的列
我们必须找到只有空值的表的列.我们正在尝试构建一个以表的名称为单位的PLPGSQL函数,并返回此类列的列表. 如何创建这样的函数? 我们使用的是pgadmin 1.16. 解决方案 您可以查询目录表 获取未定义NOT NULL的列列表,因此 can hold NULL值: SELECT quote_ident(attname) AS column_can_be_null FROM pg_attribute WHERE attrelid = 'tbl'::regclass -- valid, visible table name AND attnum >= 1 -- exclude tableoid & friends AND NOT attisdropped -- exclude dropped columns AND NOT attnotnull -- excl
2 2023-11-10
编程技术问答社区
从一个带OUT参数的函数中返回
我有一个错误,但我不知道问题是什么. 我要执行一个函数并从列填充的列中返回一个值,序列 - 序列 - 等效的currval(sequence) . 我使用: PostgreSQL 9.0 pgadmin iii CREATE OR REPLACE FUNCTION name_function(in param_1 character varying , out param_2 bigint) AS $$ BEGIN INSERT INTO table (collumn_seq,param_1) VALUES (DEFAULT,param_1) returning collumn_seq; --where:collumn_seq reference a collumn serial.. END; $$ LANGUAGE plpgsql VOLATILE; i可以创建函
2 2023-11-10
编程技术问答社区