标签: plpgsql

在触发器函数中使用动态表名INSERT

我不确定如何实现以下内容:

CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
    DECLARE
        shadowname varchar := TG_TABLE_NAME || 'shadow';
    BEGIN
        INSERT INTO shadowname VALUES(OLD.*);
        RETURN OLD;
    END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:

ERROR:  relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)

它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.

我已经尝试过EXECUTE这样的事情:

  EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)

但没有运气:

ERROR:  syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)

RECORD类型似乎失去了:OLD.*似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL值). …

postgresql triggers dynamic-sql plpgsql

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

我可以让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;
Run Code Online (Sandbox Code Playgroud)

我想避免DECLARE这样做.

postgresql variables parameters function plpgsql

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

如果没有找到记录,则返回零

我在存储过程中有一个查询,它在表中汇总了一些值:

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
Run Code Online (Sandbox Code Playgroud)

在此选择之后,我res用另一个查询检索的整数减去值并返回结果.如果WHERE条款得到验证,一切正常.但如果不是,我的所有函数返回都是一个空列(可能因为我试图减去一个空值的整数).

如果WHERE不满足该条款,如何使我的查询返回零?

sql postgresql null coalesce plpgsql

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

如何在postgresql中编写可选参数的函数?

我的要求是给函数写可选参数.参数是可选的,有时我会添加或我不会传递参数到函数.任何人都可以帮我如何编写函数.

我写得像

select * 
from test 
where field3 in ('value1','value2') 
 and ($1 is null or field1 = $1) 
 and ($2 is null or field2 = $2) 
 and ($3 is null or field3 = $3);
Run Code Online (Sandbox Code Playgroud)

我将参数传递给Query,但我的输出不是预期的.当我传递所有三个参数时,我的输出是正确的,否则它不是预期的输出.

sql postgresql plpgsql

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

SELECT .. INTO在PL/pgSQL中创建一个表

我想用来SELECT INTO在我的一个函数中创建一个临时表.SELECT INTO适用于SQL但不适用于PL/pgSQL.

此语句创建一个名为mytable的表(如果orig_table作为关系存在):

SELECT *
INTO TEMP TABLE mytable
FROM orig_table;
Run Code Online (Sandbox Code Playgroud)

但是把这个函数放到PostgreSQL中,你得到错误: ERROR: "temp" is not a known variable

CREATE OR REPLACE FUNCTION whatever()
RETURNS void AS $$
BEGIN
    SELECT *
    INTO TEMP TABLE mytable
    FROM orig_table;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我可以在PL/pgSQL SELECT INTO中输入类型的变量record,但是当从该记录中获取数据时我必须定义结构.SELECT INTO非常简单 - 自动创建一个与SELECT查询结构相同的表.有没有人解释为什么这在函数内部不起作用?

它似乎SELECT INTO在PL/pgSQL中的工作方式不同,因为您可以选择已声明的变量.不过,我不想声明我的临时表结构.我希望它能像在SQL中一样自动创建结构.

postgresql plpgsql postgresql-9.1

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

Postgis几何边界上的两个最近点

我有一个geofences存储geometry多边形的表.

我还有一个A在几何体内部的点.我要做的是找到A位于多边形几何体表面上的点的两个最近点.

PostGIS中的功能:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry
                                        ,decimal lat
                                        ,decimal lon)
  RETURNS VARCHAR AS
$BODY$

DECLARE height DECIMAL;
DECLARE accuracy VARCHAR(250);

BEGIN 

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) As tempName;

CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291
                                        ,28.0808622876029 99.1304006624291
                                        ,100              200
                                        ,23.0808622876029 96.1304006624291
                                        ))'
                              ,0)
              ) AS area; …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis plpgsql

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

PostgreSQL无法在PL/pgSQL中开始/结束事务

我正在寻求澄清如何在plpgsql函数中确保原子事务,以及为数据库的这个特定更改设置隔离级别.

在下面显示的plpgsql函数中,我想确保删除和插入成功.当我尝试将它们包装在一个事务中时,我收到一个错误:
ERROR: cannot begin/end transactions in PL/pgSQL.

如果另一个用户此功能删除了自定义行之后但有机会插入自定义行之前添加了环境的默认行为('RAIN','NIGHT','45MPH'),则执行下面的函数时会发生什么?行?是否存在包含插入和删除的隐式事务,以便在另一个用户更改此函数引用的任一行时回滚它们?我可以为此功能设置隔离级别吗?

create function foo(v_weather varchar(10), v_timeofday varchar(10), v_speed varchar(10),
   v_behavior varchar(10))
   returns setof CUSTOMBEHAVIOR
   as $body$
   begin

      -- run-time error if either of these lines is un-commented

      -- start transaction ISOLATION LEVEL READ COMMITTED;
      -- or, alternatively, set transaction ISOLATION LEVEL READ COMMITTED;


      delete from CUSTOMBEHAVIOR 
      where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;

      -- if there is no default behavior …
Run Code Online (Sandbox Code Playgroud)

transactions runtime-error plpgsql read-committed postgresql-9.2

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

学习PL/pgSQL的好资源?

我一直在寻找网络,试图找到学习PostgreSQL的过程编程语言PL/pgSQL的良好资源.

到目前为止,我唯一能够设法挖掘的是PostgreSQL文档中教程.虽然这很好,但我一直在寻找更深入的东西.你能推荐一下吗?

sql postgresql plpgsql

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

PL/pgSQL函数中的可选参数

我正在尝试用可选参数编​​写PL/pgSQL函数.它基于过滤的记录集(如果指定)执行查询,否则对表中的整个数据集执行查询.

例如(PSEUDO CODE):

CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $$
    IF len(optional_list_of_ids) > 0 THEN
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
    ELSE
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
    ENDIF
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

实现此功能的正确方法是什么?

顺便说一句,我想知道如何在另一个外部函数中调用这样的函数.我就是这样做的 - 它是正确的,还是有更好的方法?

CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $$
BEGIN
   CREATE TABLE ids AS SELECT id from …
Run Code Online (Sandbox Code Playgroud)

postgresql parameters stored-procedures plpgsql parameter-passing

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

SQL查询的函数没有结果数据的目标

我正在尝试创建一个返回SELECTed结果集的函数.当我像这样调用我的postgres函数时,select * from tst_dates_func()我得到一个错误,如下所示:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "tst_dates_func" line 3 at SQL statement

********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "tst_dates_func" line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)

这是我创建的函数:

CREATE OR REPLACE FUNCTION tst_dates_func() …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

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