- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用一个函数来设置表的 n_distinct 值。代码如下:
create temporary table _temp
(
id integer
);
create function pg_temp.setdistinct(_cnt real)
returns void as $$
begin
alter table _temp
alter column id set (n_distinct=_cnt);
end
$$ language plpgsql;
select pg_temp.setdistinct(1000);
但收到以下错误:
ERROR: invalid value for floating point option "n_distinct": _cnt
CONTEXT: SQL statement "alter table _temp
alter column id set (n_distinct=_cnt)"
PL/pgSQL function pg_temp_3.setdistinct(real) line 3 at SQL statement
可以使用 EXECUTE
语句绕过这个问题,但我想知道为什么我们不能在这个特定查询中使用变量。有什么我忽略的特定规则吗?
最佳答案
这是设计使然。手册在章节 Variable Substitution 中进行了解释:
Variable substitution currently works only in
SELECT
,INSERT
,UPDATE
,andDELETE
commands, because the main SQL engine allows queryparameters only in these commands. To use a non-constant name or valuein other statement types (generically called utility statements), youmust construct the utility statement as a string andEXECUTE
it.
您不能使用EXECUTE
参数化动态语句中的值,因为,quoting the chapter Executing Dynamic Commands :
Another restriction on parameter symbols is that they only work in
SELECT
,INSERT
,UPDATE
, andDELETE
commands. In other statement types(generically called utility statements), you must insert valuestextually even if they are just data values.
plpgsql 函数中的唯一选项 是将值连接到命令字符串中。您可以使用 format()
, 但对于简单的示例,普通连接是安全且简单的::
CREATE OR REPLACE FUNCTION pg_temp.setdistinct(_cnt real)
RETURNS void
LANGUAGE plpgsql AS
$$
BEGIN
EXECUTE 'ALTER TABLE _temp ALTER COLUMN id SET (n_distinct=' || _cnt || ')';
END
$$;
模式限定 pg_temp.
使它成为一个(未记录!)“临时”函数,反射(reflect)了这个问题。
关于n_distinct
的说明书.
关于postgresql - 使用 plpgsql 变量设置 n_distinct 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025308/
我声明我对对象问题的回答是"is",在我的情况下很方便,但我在这里问专家。 我开发了很多 plpgsql 函数,只有一个是用 C 语言开发的,但我已经明白学习曲线肯定更倾斜。 在可能的情况下,我需要一
我已经用谷歌搜索了很多,并且我有相当不错的阅读理解能力,但我不明白这个脚本是否可以在我的 postgres/postgis 盒子上的多个线程中工作。这是代码: Do $do$ DECLARE
我有一个名为 test 的表,我按名为 daterange 的范围的上限对它进行排序。我想获取此排序数据的顺序并将其保存在名为 bc_order 的同一表的另一列中。 排序的顺序必须保存在bc_ord
我在 Postgres 9.5 数据库中有以下表格: 产品 Column | Type |
我正在使用 PostgreSQL。 我需要使用 PLPGSQL 语言的存储过程,它将返回表 (SET OF RECORDS),其中包含来自 my_table 的前 2 个和后 2 个结果的计数。 例如
我想在我的应用程序中实现分页。我创建了返回记录数作为输出参数和引用游标数据本身的存储过程(具有限制和偏移量)但作为结果——我得到了——“由于 OUT 参数,函数结果类型必须是 bigint” 据我所知
我在数据库后端使用 Postgres 9.3 的报告中有以下相当简单的查询: SELECT * FROM source JOIN sourcelevel USING (source_id) JOIN
我曾经在邮件列表中读过这个条目 http://archives.postgresql.org/pgsql-hackers/2005-06/msg01481.php SELECT * FROM foo_
例如。 --Assigning value to variable in function as a parameter. create or replace function f1(number i
我正在尝试将记录或 json 存储到数组中并从函数返回 JSON: CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$ DECLA
我正在尝试创建选择数据、处理并返回它们的过程,但我正在努力如何为多列定义数组变量。 这个有效: CREATE OR REPLACE FUNCTION testing_array_return() RE
为了能够在一个数据库中创建应用程序的不同实例,例如测试阶段,我想使用变量作为模式名称。创建表或序列时一切正常,但我想不出一种在函数内部使用变量的优雅方法。我已经阅读了一些文章关于美元引用的字符串常量,
我有一个表“消息”。对于每个 INSERT'ed 行,我必须在同一个表“消息”(用于群发邮件)中插入该行的多个副本。我为它创建了一个触发器(例如一个副本)。 CREATE OR REPLACE FUN
我想在一个函数中以两种不同的方式查找数据,并在找到结果后立即返回。 首先我想运行一个查询; select * from company where company.id = x 然后,如果没有返回结果
我正在将 postgres 与 postgis 结合使用,并且我有一个包含几何数据的表格。现在我想在 plpgsql 中编写一个循环遍历行并将每个几何值存储在数组中的过程。 我应该使用什么返回类型来返
create function dept_count (dept_name varchar(20)) returns integer as $$ begin declare d_count integ
我刚刚开始使用 postgres 并且对整个事情都是陌生的,我正在使用 postgres 9.6 版并试图创建一个新函数但是我不断收到错误 ERROR: syntax error at or near
有没有一种方法可以加速我们的 plpgsql 函数,该函数在循环执行的一个查询中计算某些类型的文档?全部在一个查询中? validador := (select count(id_doc) from
我已经编写了以下函数,但是当我运行它时它没有返回任何内容。有人可以帮助确定问题吗? CREATE OR REPLACE FUNCTION GenerateReadableRandomString (
我有 Postgresql 8.4 我有一个用户表 user_id INT, user_name VARCHAR(255), user_email VARCHAR(255), user_salt VA
我是一名优秀的程序员,十分优秀!