标签: plpgsql

Postgres动态查询功能

我需要创建一个函数来运行查询并返回结果,其中包含表名和列名作为赋予函数的arugments.我目前有这个:

CREATE OR REPLACE FUNCTION qa_scf(tname character varying, cname character varying)
RETURNS SETOF INT AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM tname WHERE cname !='AK' AND cname!='CK';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud)

这给了我运行时错误"关系'tname'不存在".我是Postgres的新功能,所以任何帮助都表示赞赏.我觉得返回int是错误的,但我不知道还有什么可以让它返回返回行的所有列.谢谢!

sql postgresql plpgsql

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

如何检查PostgreSQL存储过程中是否存在行?

我在postgres中编写存储过程,我需要检查是否存在行,然后相应地执行操作.沿线的东西.

IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
  -- do something here
ELSE 
  -- do something else
END;
Run Code Online (Sandbox Code Playgroud)

我谷歌搜索了一下,但没有得到很好的点击.

postgresql stored-procedures exists plpgsql

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

PostgreSQL中基于游标的记录

我正在尝试使用游标来连接多个表的查询.我已经看到oracle有一个基于游标的记录.当我为Postgres尝试相同时,它会抛出一些错误.我怎么能在Postgres做同样的事情?

CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
    xyz CURSOR FOR select * from address ad
                            join city ct on ad.city_id = ct.city_id;    
    xyz_row RECORD;
BEGIN   
    open xyz;

    LOOP
    fetch xyz into xyz_row;
        exit when xyz_row = null;
        if xyz_row.city like '%hi%' then
            return next xyz_row.city;               
        end if;
    END LOOP;
    close xyz;  
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ERROR:  relation "xyz" does not exist
CONTEXT:  compilation of PL/pgSQL function "avoidable_states" near line 4
Run Code Online (Sandbox Code Playgroud)

postgresql loops plpgsql cursor

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

从PL/pgSQL函数返回包含未知列的动态表

我需要创建一个函数,检查给定的表是否infowindow存在该字段.如果它存在,则函数必须返回select * from table但如果不存在,则必须返回一个附加id字段:

CREATE OR REPLACE FUNCTION getxo_ocx_cincu_preparar_infowindow(
                                              guretabla character varying)
  RETURNS TABLE AS
$BODY$ 
DECLARE
    tabla ALIAS FOR $1;

BEGIN

IF  EXISTS (SELECT 1
   FROM   pg_namespace n
   JOIN   pg_class     c ON c.relnamespace = n.oid
   JOIN   pg_attribute a ON a.attrelid = c.oid 
   WHERE  n.nspname = current_schema()  -- default to current schema
   AND    c.relname = tabla
   AND    a.attname = 'infowindow'
   AND    NOT a.attisdropped)
THEN
    RETURN QUERY EXECUTE 'SELECT * from ' ||tabla ;
ELSE …
Run Code Online (Sandbox Code Playgroud)

postgresql polymorphism return-type dynamic-sql plpgsql

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

将SELECT结果作为参数传递给postgreSQL函数

我有一个表"UserState",其中包含以下字段:id,userid,ctime,state,endtime.我有一个简单的查询:

SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp
Run Code Online (Sandbox Code Playgroud)

我有一个plpgsql函数,它必须将此查询的结果作为参数:

get_timeinstate(SELECT userid FROM "UserState" WHERE ctime>'2014-07-14'::timestamp);
Run Code Online (Sandbox Code Playgroud)

如何正确创建函数以将查询结果作为参数传递给那里?有必要理解,该函数返回另一个SQL结果,我需要在那里使用"IN"条件:

$func$
BEGIN
 RETURN QUERY
 SELECT 
...myanotherquery...
 WHERE "UserState".userid IN (HERE I NEED TO INSERT MY QUERY RESULT)
END;
$func$
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

如何编写一个不返回任何内容的postgres存储过程?

如何在postgres中编写一个不返回值的简单存储过程?当我调用存储过程时,即使使用void返回类型,我也会返回一行.

CREATE FUNCTION somefunc(in_id bigint) RETURNS void AS $$
BEGIN
   DELETE from test_table where id = in_id;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures plpgsql

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

PostgreSQL函数或输出多列的存储过程?

这是我理想的想法.想象一下,我有一个A行的表.

我想要做:

SELECT A, func(A) FROM table
Run Code Online (Sandbox Code Playgroud)

并为输出说4列.

有没有办法做到这一点?我已经看到了自定义类型或任何可以让你得到一个看起来像的结果的东西

A B C D)

但是,如果我能让一个函数返回多个列而不再进行重新分析,那将会非常棒.

有没有什么可以做这样的事情?

postgresql stored-procedures plpgsql sql-function

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

在PostgreSQL中每行只执行一次延迟触发器

我AFTER UPDATE在表上有一个延迟触发器,设置为在某个列更新时触发.这是我用作计数器的整数类型.

我不是100%肯定,但看起来如果我在事务期间将该特定列增加100次,则触发器在事务结束时排队并执行100次.

我希望触发器每行只安排一次,无论我增加了多少次该列.

我能以某种方式这样做吗?或者,如果触发的触发器必须排队,无论它们是否重复,我是否可以在首次运行触发器时清除此队列?

Postgres的版本是9.1.这是我得到的:

CREATE CONSTRAINT TRIGGER counter_change
    AFTER UPDATE OF "Counter" ON "table"
    DEFERRABLE INITIALLY DEFERRED
    FOR EACH ROW
    EXECUTE PROCEDURE counter_change();

CREATE OR REPLACE FUNCTION counter_change()
    RETURNS trigger
    LANGUAGE plpgsql
    AS $$
DECLARE
BEGIN

PERFORM some_expensive_procedure(NEW."id");

RETURN NEW;

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

postgresql triggers database-design plpgsql

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

通过RAW plpgsql中的UPDATE语句获取受影响的行

这里和这里已经多次询问过,但是在我的情况下没有一个答案是合适的,因为我不想在PL/PgSQL函数中执行我的更新语句并使用GET DIAGNOSTICS integer_var = ROW_COUNT.

我必须在原始SQL中执行此操作.

例如,在MS SQL SERVER中,我们有@@ ROWCOUNT,可以使用如下所示:

UPDATE <target_table> 
SET Proprerty0 = Value0
WHERE <predicate>;
SELECT <computed_value_columns> 
 FROM <target> 
 WHERE @@ROWCOUNT > 0;
Run Code Online (Sandbox Code Playgroud)

在数据库的一次往返中,我知道更新是否成功并返回计算值.

什么可以用来代替'@@ ROWCOUNT'?有人可以确认此时这实际上是不可能的吗?

提前致谢.

编辑1:我确认我需要使用原始SQL(我在原始描述中写了"raw plpgsql").

为了使我的问题更清楚,请考虑更新语句只影响一行并考虑乐观并发:

  1. 客户首先做了一份SELECT声明.

  2. 他构建了UPDATE并知道哪些数据库计算列将包含在SELECT子句中.除其他外,谓词包括每次更新行时计算的时间戳.

  3. 所以,如果我们返回1行,那么一切都OK.如果没有返回行,那么我们知道先前有更新,并且客户端可能需要在再次尝试更新子句之前刷新数据.这就是为什么我们需要知道在返回计算列之前受update语句影响的行数.如果更新失败,则不应返回任何行.

postgresql plpgsql optimistic-concurrency postgresql-9.2

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

比较postgres中的软件版本

有没有办法在postgres中比较软件版本(例如XYZ> ABC)?我正在搜索string/varchar或"version"类型的函数.

我发现了http://pgxn.org/dist/semver/doc/semver.html,但我正在寻找替代方案(不是那么容易部署..)

非常感谢.

postgresql version plpgsql version-sort

12
推荐指数
4
解决办法
3269
查看次数