标签: plpgsql

如何在导出中排除PL/pgSQL函数?

我使用以下命令从服务器的数据库转储一些结构,以便能够在我的本地硬盘驱动器上创建数据样本.

pg_dump -h myserver.com -U product_user -s -f ./data/base.structure.postgresql.sql -F p -v -T public.* -T first_product.* -T second_product.* -T another_product.locales mydatabase
Run Code Online (Sandbox Code Playgroud)

我需要排除一些模式,否则它会最终导致权限或其他错误.即使我排除了schema public,它也会转储该模式中的所有函数,如下所示:

REVOKE ALL ON FUNCTION gin_extract_trgm(text, internal) FROM PUBLIC;
psql:./data/base.structure.postgresql.sql:8482: ERROR:  function gin_extract_trgm(text, internal) does not exist
Run Code Online (Sandbox Code Playgroud)

我知道这来自PostgreSQL中的全文或相似插件,但是我没有使用它而且我的机器上不需要它,所以我想排除这些功能.

我怎么能这样做?

postgresql pg-dump plpgsql

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

将表和更改日志合并到PostgreSQL中的视图中

我的PostgreSQL数据库包含一个用于存储已注册实体实例的表.此表格通过电子表格上传填充.Web界面允许操作员修改所呈现的信息.但是,原始数据不会被修改.所有的改变都存储在一个单独的表changes与列unique_id,column_name,valueupdated_at.

更改完成后,首先查询原始表,然后查询更改表(使用实例ID和最新更改日期,按列名称分组),将其呈现给操作员.这两个结果在PHP中合并,并在Web界面上显示.这是执行任务的一种相当严格的方式,我想将所有逻辑保留在SQL中.

我可以使用以下查询轻松选择表的最新更改:

SELECT fltr_chg.unique_id, fltr_chg.column_name, chg_val.value 
FROM changes AS chg_val
JOIN ( 
      SELECT chg_rec.unique_id, chg_rec.column_name, MAX( chg_rec.updated_at )
      FROM information_schema.columns AS source
      JOIN changes AS chg_rec ON source.table_name = 'instances'
                             AND source.column_name = chg_rec.column_name
      GROUP BY chg_rec.unique_id, chg_rec.column_name
     ) AS fltr_chg ON fltr_chg.unique_id = chg_val.unique_id
                  AND fltr_chg.column_name = chg_val.column_name;
Run Code Online (Sandbox Code Playgroud)

instances表中选择条目同样简单:

SELECT * FROM instances;
Run Code Online (Sandbox Code Playgroud)

现在,如果只有一种方法可以转换前一个结果并将结果值替换为后者,基于unique_idcolumn_name,并且仍将结果保留为表格,则问题将得到解决.这可能吗?

我确信这不是最罕见的问题,而且很有可能,某些系统会以类似的方式跟踪数据的变化.如果不是通过上述方法之一(当前和寻求的解决方案),他们如何将它们应用于数据?

php postgresql dynamic-sql crosstab plpgsql

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

从Java调用PostgreSQL中的存储过程

我编写了一个存储过程,我想用Java调用它.但我不认为它能够对我通过的查询做任何事情.以下是我的java代码:

String QUERY_LOCATION = "select (license_plate) as test from carInst( (select     category_name from reservation where rid = ?) , (select lname from reservation where rid =  ?))";  
        //PreparedStatement check_location = null;
        PreparedStatement check_location = connection.prepareStatement(QUERY_LOCATION);
        check_location.setInt(1, rid);
        check_location.setInt(2, rid);
        rs = check_location.executeQuery();
        if (rs.next()) {
            System.out.print("Car found: "+rs.getString("test")+"\n");
            license_plate = rs.getString("test");
            update_reservation.setString(5, license_plate);

            bool = false;
        } else {
            System.out
                    .print("There is no car available\n");
        }
Run Code Online (Sandbox Code Playgroud)

以下是我用PL/pgSQL(PostgreSQL)编写的存储过程:

CREATE OR REPLACE FUNCTION carInst(cname varchar(20), loc varchar(20) ) 
RETURNS TABLE (license_plate varchar(6) …
Run Code Online (Sandbox Code Playgroud)

java sql postgresql stored-procedures plpgsql

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

在开始和结束时动态创建数组

如何在PostgreSQL中动态创建数组?

考虑这个,例如:

CREATE OR REPLACE FUNCTION fun( )
RETURNS SETOF void AS
$BODY$
DECLARE

i numeric;

BEGIN

 FOR i in 1..10   LOOP
     //I have to create an array as 
     arr1[] ,arr2[] ... based on length
 END LOOP;
END;

$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

arrays postgresql plpgsql

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

在动态COPY语句中使用函数变量

根据PostgreSQL的文档,可以直接从查询中将数据复制到csv文件,而无需使用中间表.我很好奇如何做到这一点.

CREATE OR REPLACE FUNCTION m_tbl(my_var integer)
    RETURNS void AS
$BODY$
DECLARE
BEGIN

   COPY (
       select my_var
   )
   TO 'c:/temp/out.csv';

END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:没有这样的列'my_var'.

postgresql plpgsql

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

Postgresql - 建立一个plpgsql函数

我是plpgsql的初学者,我被困在编码函数中.我需要一个执行以下操作的函数:

给表,该表中的id_field以及该表中的另一个字段:

原始表

id_field     field_traspose
---------    --------------
    1              A
    1              B
    1              C
    2              A
    3              F
    3              X
Run Code Online (Sandbox Code Playgroud)

结果

id_field     field_traspose
---------    --------------
    1              A, B, C
    2              A
    3              F, X
Run Code Online (Sandbox Code Playgroud)

我的尝试:

CREATE OR REPLACE FUNCTION traspose(mytable character varying, id_field character varying, field_traspose character varying)
  RETURNS setof RECORD AS
$BODY$ 
DECLARE
    r record;
    result record;
BEGIN

FOR r IN EXECUTE 'SELECT '||id_field||','||field_traspose||'  from '||mytable LOOP

-- Here should go the logic that joins every field_traspose for a same …
Run Code Online (Sandbox Code Playgroud)

postgresql function plpgsql user-defined-functions

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

如何在Postgres中获得执行时间

我需要在plpgsql脚本中出于多种目的(计算,显示和存储)在变量中获取最后一个查询的执行时间,所以\timing我找不到psql 选项,因为我无法操纵结果时间。您是否知道是否有类似“ get diagnostics”命令的内容,但是要执行时间(或变通)?

get diagnostics my_var := EXECUTION_TIME;
Run Code Online (Sandbox Code Playgroud)

我找不到任何东西比其他row_countresult_oid...

postgresql plpgsql

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

当没有记录时,FOUND变量设置为"true"

PLPGSQL函数中,我有一些行来检查记录是否存在.好吧,即使没有记录,FOUND变量也会设置为TRUE.非常奇怪的事情.

我正在测试的行是:

query:='SELECT i.identity_id FROM app.identity as i,' || quote_ident(schema_name) || '.users as u,' || quote_ident(schema_name) || '.udata as ud WHERE i.identity_id=' || p_identity_id || ' and u.identity_id=i.identity_id and ud.identity_id=i.identity_id';
        RAISE WARNING 'query=%',query;
        PERFORM query;
        RAISE WARNING 'FOUND=%',FOUND;
        IF FOUND 
        THEN
            RAISE WARNING 'Record found, rising an exception';
            RAISE EXCEPTION USING ERRCODE = 'AA002';
        END IF;
Run Code Online (Sandbox Code Playgroud)

这是输出:

WARNING:  query=SELECT i.identity_id FROM app.identity as i,"comp-1049007476".users as u,"comp-1049007476".udata as ud WHERE i.identity_id=-1615382132 and u.identity_id=i.identity_id and ud.identity_id=i.identity_id …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

将表名传递给函数并返回表

我需要在数据库(PostgreSQL 9.3.5)的许多表上运行相同的查询,并将表名作为参数传递给函数似乎是一件逻辑的事情。通过阅读文档中的示例和众多SO帖子,我仍然无法确定。

使用以下最小示例:

CREATE TABLE films (
code        char(5),
kind        varchar(10)
);
INSERT INTO films VALUES
('UA502', 'Comedy');
Run Code Online (Sandbox Code Playgroud)

而这个功能:

CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS void AS  -- I know, void is not what I am after
$func$
BEGIN
   EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

以下查询捕获了一些内容:

mydb=> SELECT foo('films');
 foo
-----
(1 row)
Run Code Online (Sandbox Code Playgroud)

但是,因为我要检索表,所以我编辑第二行并重新创建该函数,如下所示:

CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS TABLE(count integer) AS
$func$
BEGIN
   EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$  LANGUAGE …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

Postgresql创建函数错误

我在以下功能中做错了什么?

CREATE OR REPLACE FUNCTION extended_sales(area_type varchar, area_code varchar, dpci varchar) RETURNS TABLE(task_id bigint, location_id int)as

$BODY$

BEGIN 
    IF area_type = 1 THEN
        RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.task_payload->>'str_area_type_i'='3';
    ELSE IF area_type = 2 THEN
        RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.due_date < '2017-10-06';
    ELSE
        RETURN QUERY select T.task_id, T.location_id from store_price.task T where task_payload->>'str_area_type_i'='1' and task_payload->>'str_area_c'='7'  and due_date < '2016-11-07';
    END IF;


END

$BODY$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我运行上述功能时,它会出现以下错误

ERROR:  syntax error at end …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

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