标签: plpgsql

Postgres创建时间戳转换函数

我正在尝试创建一个 postgres 函数,它将输入时间戳转换为 PDT。这是我的代码:

CREATE OR REPLACE FUNCTION getPdtTimestamp(inTS TIMESTAMP) RETURNS TIMESTAMP AS $$
DECLARE
    outTS TIMESTAMP;
BEGIN
    SELECT TIMESTAMP with time zone inTS AT TIME ZONE 'PDT' INTO outTS;
    RETURN outTS;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我在这里得到的错误是:

syntax error at or near "inTS"
Run Code Online (Sandbox Code Playgroud)

我的目标是创建一个查询函数,如下所示:

SELECT TIMESTAMP with time zone '2012-01-01 12:00:00' AT TIME ZONE 'PDT';
// returns a value
Run Code Online (Sandbox Code Playgroud)

提前致谢

postgresql timestamp function plpgsql

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

PostgreSQL 错误:RETURN NEXT 不能在带有 OUT 参数的函数中包含参数

我在 PostgreSQL 9.2 中有一个 plpgsql 函数,它返回一个表。我尝试找到数据库中的点对之间的距离。但我面临这个问题标题中的错误。

我想做这样的事情:

CREATE OR REPLACE FUNCTION max_dis(which_tab text)
RETURNS TABLE(P1 geometry, P2 geometry, dis double precision) as

$$
DECLARE
   my_row RECORD;
   my_row2 RECORD;

BEGIN

    FOR my_row IN EXECUTE ('SELECT * FROM '||which_tab) LOOP
         -- 
       FOR my_row2 IN EXECUTE ('SELECT * FROM '||which_tab) LOOP

        SELECT ST_DISTANCE(my_row.the_geom, my_row2.the_geom) 

        INTO dis;

            RETURN NEXT my_row,my_row2; 

        END LOOP;

    END LOOP;

    RETURN;

END ;

$$
LANGUAGE plpgsql VOLATILE STRICT; 
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

创建返回文本数组的函数

我尝试创建一个函数,该函数将返回以下查询的内容,其中 proto_location 的类型为文本。不确定这是否重要,但我当前调用此查询的 java 代码只是将每条记录读取为字符串。

SELECT DISTINCT tm.proto_location
FROM track_message tm
WHERE tm.workflow_analytic_instance_id = 204
AND EXISTS ( SELECT *
    FROM track_message_to_track_mapping tm2tm
    JOIN track t ON t.id = tm2tm.track_id
    JOIN track_item ti ON t.id = ti.track_id
    JOIN track_point tp ON ti.id = tp.track_item_id
    WHERE tm.id =tm2tm.track_message_id
    AND ti.item_time BETWEEN 1328816277089000 AND 1328816287089000
    AND ST_Intersects
            (tp.track_position
            , ST_GeomFromText('POLYGON((-144 59, -41 46, -75 15, -127 25, -144 59))',4326)
            )
    )
    ;
Run Code Online (Sandbox Code Playgroud)

这是我的功能

CREATE OR REPLACE Function getTrackMessages(workflow bigint, start_time bigint, end_time …
Run Code Online (Sandbox Code Playgroud)

sql postgresql stored-procedures plpgsql

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

Postgres 函数与文本数组并选择查询中的位置

我需要创建一个像这样的函数(缩小到最小值),在其中发送应该匹配的字符串数组。但我无法使查询工作。

create or replace function bar(x text[]) returns table (c bigint) language plpgsql as $$
begin
    return query select count(1) as counter from my_table where my_field in (x);
end;$$;
Run Code Online (Sandbox Code Playgroud)

并这样称呼它

select * from bar(ARRAY ['a','b']);
Run Code Online (Sandbox Code Playgroud)

我可以尝试让参数 x 成为单个文本字符串,然后使用类似的东西

return query execute 'select ... where myfield in ('||x||')';
Run Code Online (Sandbox Code Playgroud)

那么我该如何让它以数组形式使用参数呢?与让参数为字符串相比,这会更好还是更差?

arrays postgresql plpgsql where-clause

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

plpgsql中case语句的返回值

如何从使用语句的用户定义函数设置值(或直接返回值)case

create function is_bar(email varchar) returns boolean as
$$
declare returnValue boolean;
begin
  select case when exists
  (select * from (users join user_roles on users.userID = user_roles.userID)
  where user_email=email and user_role='bar')
    then (returnValue := TRUE);
    else (returnValue := FALSE);
  end;
  return returnValue;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

给我:

ERROR:  syntax error at or near ":="
LINE 8: then (returnValue := TRUE);
Run Code Online (Sandbox Code Playgroud)

sql postgresql case syntax-error plpgsql

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

连接 PostgreSQL 触发器函数的 if 语句

我有一个a包含 3 个触发器的表,每当插入、更新或删除b行时,它们a都会插入、更新或删除相应的行。所有 3 个触发器使用相同的触发功能p

CREATE OR REPLACE FUNCTION p ()
RETURNS TRIGGER
AS $$
BEGIN
  IF (TG_OP = 'INSERT') THEN
    -- INSERT INTO b ...
    RETURN NEW;
  ELSIF (TG_OP = 'UPDATE') THEN
    -- UPDATE b ...
    RETURN NEW;
  ELSIF (TG_OP = 'DELETE') THEN
    -- DELETE FROM b ...
    RETURN NEW;
  ELSE
    RETURN NULL;
  END IF;
END;
$$ LANGUAGE PLPGSQL;

CREATE TRIGGER i AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers join plpgsql database-trigger

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

使用 format() 多次使用相同参数的动态查询

我有一个过程,它将表名称的后缀作为输入。然后,使用execute format(),我传递此参数来执行动态查询。问题是这个参数始终是相同的 - 我不想像这样传递它 x 次:

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3
FROM table_%s', inTableSuffix, inTableSuffix, inTableSuffix, inTableSuffix, ...) 
Run Code Online (Sandbox Code Playgroud)

我想要类似于以下的格式:

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3
FROM table_%s', inTableSuffix) 
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用表名的别名来解决这个问题,但是还有其他选择吗?

sql database postgresql dynamic-sql plpgsql

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

For循环遍历临时表

我有一个临时表function(postgresql)

create temporary table temp_table (
id serial
,breakup_id integer
,enquiry_id integer
,estimate_id integer
,customer_name CHARACTER VARYING
,month integer
,year integer
,amount numeric
) on commit drop;
Run Code Online (Sandbox Code Playgroud)

我需要for loop这个临时表来amount使用 更新列breakup_id。如何做到这一点postgresql function

sql postgresql plpgsql

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

当数组为空而没有动态sql时,Postgres sql返回所有

我遇到了一个问题postgres sql function,当整数数组为空时,我需要返回所有记录。

现在我使用检查数组是否为空dynamic sql来实现它if statement,所以不要in statement在查询中连接。我想知道是否有另一种方法可以实现它而不需要dynamic sql

例如使用动态sql:

CREATE OR REPLACE FUNCTION testme() RETURNS TABLE(Title text) LANGUAGE plpgsql AS $$
DECLARE
one int[];
BEGIN
one:= '{}';

RAISE NOTICE 'value:%', array_length(one,1);
if array_length(one,1) > 0 THEN
RETURN QUERY EXECUTE 'SELECT  "Title" from "Tickets" where "TicketID"  
IN(SELECT(UNNEST($1)));'  USING one;
ELSE
RETURN QUERY EXECUTE 'SELECT "Title"  from "Tickets"';

END IF;
END
$$;
SELECT testme();
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

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

TYPE IS TABLE OF,从 Oracle 到 PostgreSQL

我目前正在将一些过程从 Oracle 迁移到 Postgres,这些过程使用的类型是为处理未知数量的值而创建的:

TYPE array_text IS TABLE OF VARCHAR2 (50);
Run Code Online (Sandbox Code Playgroud)

所以他们可以声明一个变量,如:

myValues in array_text;
Run Code Online (Sandbox Code Playgroud)

稍后以这种方式使用它:

myValues(1) := 'VALUE1';
myValues(2) := 'VALUE2';
...
Run Code Online (Sandbox Code Playgroud)

所以我一直在学习并尝试使用 Postgres 复制这种行为,但直到现在我找不到合适的方法。我尝试创建一个复合类型,如:

CREATE TYPE array_text AS (
    val varchar(50)
);
Run Code Online (Sandbox Code Playgroud)

或者

CREATE TYPE array_text AS (
    v varchar(50)[]
);
Run Code Online (Sandbox Code Playgroud)

但是,我无法像使用原始版本那样使用它们,实际上我无法创建成功的测试。

我怎么能得到这种行为或类似的东西?所以我可以设置和获取值,甚至像在 Oracle 中一样计算它的长度

sql oracle postgresql plpgsql

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