标签: plpgsql

PostgreSQL:从表中返回选择计数(*);

请再帮我一个PL / pgSQL问题。

我有一个PHP脚本作为每日cronjob运行,并从1个主表中删除了旧记录,并删除了一些其他引用其“ id”列的表:

create or replace function quincytrack_clean()
        returns integer as $BODY$
        begin
                create temp table old_ids 
                (id varchar(20)) on commit drop;

                insert into old_ids
                select id from quincytrack
                where age(QDATETIME) > interval '30 days';

                delete from hide_id where id in
                (select id from old_ids);

                delete from related_mks where id in
                (select id from old_ids);

                delete from related_cl where id in
                (select id from old_ids);

                delete from related_comment where id in
                (select id from old_ids);

                delete …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

在plpgsql中初始化多维数组

谁能告诉我如何在plpgsql中初始化多维数组?谢谢.

postgresql plpgsql

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

pl/pgsql如果更新成功,则返回true

给定以下骨架pl/pgsql函数,true如果更新成功(某些内容实际更新),如何返回,否则返回false?

CREATE FUNCTION UpdateThingy(
    /* input parameters */
) RETURNS BOOLEAN AS $$
BEGIN
    UPDATE thingies SET /* blah blah */ WHERE /* blah blah */;
    RETURN true;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

目前这将始终返回true,即使没有更新的行.我希望false在没有行受更新影响的情况下返回.

postgresql plpgsql

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

用于自动完成字段的类似UTF-8字符串

背景

用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm模块.

问题

代码类似于以下内容:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    label % 'fil'
  ORDER BY
    similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)

当用户键入时fil,查询匹配filbert但不匹配filé powder.(因为重音字符?)

解决方案#1失败

我试图实现一个unaccent函数并将查询重写为:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    unaccent( label ) % unaccent( 'fil' )
  ORDER BY
    similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)

这只返回filbert.

解决方案#2失败

建议:

CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;

CREATE OR REPLACE FUNCTION unaccent_text(text)
  RETURNS text AS
$BODY$
  SELECT unaccent($1); …
Run Code Online (Sandbox Code Playgroud)

postgresql similarity utf-8 plpgsql string-comparison

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

使用输入变量时,Postgres功能要慢得多

我在Postgres 8.3.5中有一个函数,它从多个表中选择数据并将结果转储到一个表中:

create or replace function test_function_2(startdate timestamp, enddate timestamp)
returns void as $$
begin
     delete from cl_final_report;

     INSERT INTO cl_final_report
     SELECT 
         b.batchkey AS batchnumber, 
         pv.productkey, 
         p.name AS productname, 
         avg(r.value) AS avgchemlean, 
         sum(r.auxvalue) AS totalweight, 
         max(o.time) AS timecompleted
     FROM result r
     LEFT JOIN physicalvalue pv ON r.physicalvaluekey = pv.physicalvaluekey
     LEFT JOIN product p ON pv.productkey = p.productkey
     LEFT JOIN object o ON r.objectkey = o.objectkey
     LEFT JOIN batch b ON o.batchkey = b.batchkey
     WHERE pv.name = 'CL'::text AND
         and o.time …
Run Code Online (Sandbox Code Playgroud)

postgresql performance function plpgsql postgresql-8.3

2
推荐指数
2
解决办法
3411
查看次数

PL/pgSQL返回查询给出了伪类型记录而不是表

我的第一个PL/pgSQL函数被设计为将几何列作为输入并输出一个fishnet/grid表(对我来说是一个常见的任务).

我不确定在return语句中我做错了什么,因为我正在返回伪类型记录而不是具有不同列的表.

我的代码:

CREATE OR REPLACE FUNCTION ST_Fishnet(
        nrow integer, 
        ncol integer,
        geo_table varchar,
        geom_column varchar)
RETURNS Table( ids text, geom geometry)
AS $$
DECLARE
    collected_geom geometry;
    xmin numeric;
    xmax numeric;
    ymin numeric;
    ymax numeric;
    xsize numeric;
    ysize numeric;
BEGIN
    EXECUTE 'SELECT st_collect("'||$4||'") FROM "'||$3||'"' INTO collected_geom;
    xmax := st_xmin(collected_geom);
    xmin := st_xmax(collected_geom);
    ymin := st_ymin(collected_geom);
    ymax := st_ymax(collected_geom);
    xsize := abs(xmax - xmin) / $2;
    ysize := abs(ymax - ymin) / $1;
    RETURN QUERY 
        SELECT
            i+1||'-'||j+1 as ids,
            ST_Translate(cell, …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis plpgsql

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

在PostgreSQL数据库的所有模式中向表中添加一列

我有一个Postgres 8.4架构,如下所示:

My_Database
 |-> Schemas
       |-> AccountA
       |-> AccountB
       |-> AccountC
       |-> AccountD
       |-> AccountE
      ...
       |-> AccountZ
Run Code Online (Sandbox Code Playgroud)

所有模式都有一个调用的表product,我想立即为它们添加一个布尔列.是否有可能做到这一点?

我到目前为止找到的唯一方法是按帐户运行以下SQL帐户.

ALTER TABLE product ADD COLUMN show_price boolean NOT NULL DEFAULT TRUE;
Run Code Online (Sandbox Code Playgroud)

sql postgresql ddl plpgsql postgresql-8.4

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

Postgresql CREATE TABLE AS INSERT RETURNING

我想尝试做类似的事情

CREATE TEMP TABLE tblname AS (
  INSERT INTO tbl2 FROM SELECT(1,1) RETURNING a,b 
);
Run Code Online (Sandbox Code Playgroud)

但我有错误:语法错误在"INSERT"或附近;

是否可以组合CREATE TABLE AS SELECT和INSERT FROM SELECT RETURNING子句?

postgresql plpgsql create-table sql-returning

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

如何在PL/pgSQL中正确使用`RETURN NEXT`?

我正在尝试使用返回表的PL/pgSQL(PostgreSQL 9.3)函数编写循环.我RETURN NEXT;在循环中的每个查询后都没有使用参数,下面的示例如plpgsql错误"RETURN NEXT在表返回函数中没有函数和OUT参数",以及其他地方.但是,我仍然收到一条错误消息:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
Run Code Online (Sandbox Code Playgroud)

下面是重现问题的最小代码示例.任何人都可以请帮助解释如何修复测试代码以返回表格?

提前致谢.

最小的例子:

CREATE OR REPLACE FUNCTION test0()
 RETURNS TABLE(y integer, result text) AS $func$
DECLARE
    yr RECORD;
BEGIN
    FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y) 
    LOOP
        RAISE NOTICE 'Computing %', yr.y;
        SELECT yr.y, 'hi';
        RETURN NEXT;
    END LOOP;
    RETURN;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

2
推荐指数
3
解决办法
8306
查看次数

在PL / pgSQL中动态执行查询

我已经找到了我要在Oracle和SQL Server上解决的问题的解决方案(我认为),但是似乎无法将其转换为Postgres解决方案。我正在使用Postgres 9.3.6。

这个想法是为了生成用于分析目的的有关表内容的“元数据”。这只能通过让每一列都运行查询来找出(例如...)最小/最大/计数值等来完成(AFAIK)。为了使过程自动化,最好让数据库生成查询,然后执行查询。

使用示例salesdata表,我可以使用以下代码段为每列生成一个选择查询,并返回min()值:

SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '  
FROM information_schema.columns 
WHERE table_name = 'salesdata'
Run Code Online (Sandbox Code Playgroud)

优点是,无论列数如何,数据库都会生成代码。现在,我想到了无数个地方来存储这些查询,这些查询可以是某种变量,也可以是表列,其想法是执行这些查询。我想将生成的查询存储在变量中,然后使用EXECUTE(或EXECUTE IMMEDIATE)语句执行它们,这是此处采用的方法(请参见右窗格),但是Postgres不会让我在函数外部声明变量,因此我一直在抓挠我对如何将它们组合在一起,无论是什至是遵循的方向,也许还有更简单的东西。

您有任何指点吗,由于其他问题,我目前正在尝试类似的方法,但不知道我是否朝着正确的方向前进:

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
    dyn_sql text; 
BEGIN            
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'    
    FROM information_schema.columns 
    WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;    
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql aggregate-functions dynamic-queries

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