标签: plpgsql

插入或选择后返回id

我想构建一个函数,如果表中不存在电子邮件值并返回email_id行的值,则该函数将插入电子邮件。我怎样才能做到这一点?
另外,如果电子邮件没有插入并且它已经存在于数据库中,我该如何返回 ID?我需要执行另一个SELECT吗?

BEGIN;
  LOCK TABLE mailing_list IN SHARE ROW EXCLUSIVE MODE;
  INSERT INTO mailing_list (email)
  SELECT 'email'
   WHERE NOT EXISTS (
     SELECT * FROM mailing_list WHERE email='email'
   );
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我试过添加,returning id但它不起作用。我有:

查询没有结果数据的目的地

Sqlfiddle

postgresql insert concurrency plpgsql postgresql-9.3

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

从另一个函数创建一个函数

是否可以从另一个 plpgsql 函数创建一个新函数?像这样的东西:

CREATE OR REPLACE FUNCTION func_test()
RETURNS VOID AS
$BODY$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
  BEGIN
  $$
    SELECT 1;
  $$
  END
END
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,我得到:

ERROR:  unexpected end of function definition at end of input
LINE 13: $BODY$`
Run Code Online (Sandbox Code Playgroud)

postgresql ddl plpgsql functions

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

pl/pgsql:从记录中动态获取列名

您好,我想从记录中动态获取列名。如下面的代码所示,我创建了一个游标,并使用循环通过将每一行提取到记录类型 r1 来处理该游标中的每条记录。在我的表中,我有这些列 [dlq_2000,dlq_2001,...,dlq_2017,dlq_2017]。我还在其顶部创建了一个循环来单独处理每一列。

我面临的问题是动态从 r1 获取字段名称,当我运行代码时收到此错误:

[Err] 错误:记录“r1”没有字段“'dlq_'||counter::text”上下文:SQL 语句“SELECT (r1."'dlq_'||counter::text" = 1 )”

请建议如何解决这个问题。

谢谢你,

CREATE OR REPLACE FUNCTION update()
   RETURNS VOID AS $$
DECLARE 
cur SCROLL CURSOR   FOR select * from my_tbl;
r1 RECORD;
begin
OPEN cur ;
FOR counter IN  2000..2017 LOOP
    r1 := NULL;
    LOOP
        FETCH cur INTO r1;
        EXIT WHEN NOT FOUND;

        IF (r1."'dl_'||counter::text" = 1 ) THEN
            -- do some thing
            RAISE NOTICE 'processing year of : %', counter;
        END IF;     
    END LOOP;
END …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql postgresql-9.3

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

将 current_setting('the_setting') 的结果赋给 PL/pgSQL 中的一个变量

我有一个函数,我需要获取一个配置参数并将其分配给我稍后将在函数中使用的变量。问题是当配置参数不被识别(因为它还不存在)时,函数就会死亡。我想评估是否可以分配变量,如果不能为其设置空值。

这是我尝试过的:

   DECLARE
      conf_param text;
      num integer;

   BEGIN
      SELECT current_setting('the_setting') INTO conf_param;
         -- here is where dies when the_setting is not recognized!
      IF FOUND THEN
         num := conf_param::integer;
      ELSE
         num := NULL;
      END IF;
      -- more stuff
Run Code Online (Sandbox Code Playgroud)

我不确定我使用Found的方式是否需要。

postgresql parameter plpgsql

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

如何获取数据库中所有表中每个TEXT字段的最大字段值长度

我正在尝试获取有关数据库中数据的信息。我在几个表中有几列输入“TEXT”。我想执行一个查询,该查询将创建如下所示的结果:

|table_name|column_name|max_length|
-----------------------------------
|my_table  |name       |35        |
Run Code Online (Sandbox Code Playgroud)

我有查询来获取所有表和列:

SELECT table_name, column_name FROM information_schema.columns
WHERE table_schema = 'public' AND data_type = 'text'
ORDER BY table_name
Run Code Online (Sandbox Code Playgroud)

但我现在不知道如何遍历每个表和列以获得每列的最大长度。我确实有一个查询来获取特定列和表的最大长度:

SELECT 'my_table', 'name', MAX(LENGTH(name)) FROM my_table
Run Code Online (Sandbox Code Playgroud)

如何进行查询,根据查询结果动态获取最大长度以获取所有表和列?

postgresql dynamic-sql plpgsql

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

PL/pgSQL 函数创建中的错误

我不知道这个问题是否更适合这里或 SO ...

这是我想启动的脚本(该函数的代码是从 SO 上的一个问题复制的):

\c mydb

create or replace function truncate_tables(username in varchar) returns void as $$
declare
    stmt RECORD;
    statements cursor for select tablename from pg_tables where tableowner = username;
begin 
    for stmt in statements loop
        execute 'truncate table ' || quote_ident(stmt.tablename) || ' CASCADE ;';
    end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR: syntax at or near "$1"    LINE1:   $1
QUERY $1
CONTEXT: SQL statement in PL/PgSQL function "truncate_tables" near line 5
Run Code Online (Sandbox Code Playgroud)

我是 Postgres …

postgresql dynamic-sql cursors plpgsql postgresql-8.3

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

如何关闭生产服务器上的所有 RAISE NOTICE?

为了调试目的,我在函数中放置了很多 RAISE NOTICE。我认为这会影响性能,所以应该在生产环境中删除它们。有没有办法仅在特定条件下选择退出这些日志记录/断言功能?

postgresql logs plpgsql

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

将记录变量中的值插入表中

我正在开发一个带有两个参数的用户定义函数:

create or replace function gesio(
    events_table_in regclass,  
    events_table_out regclass)
returns void as $$ ... $$
Run Code Online (Sandbox Code Playgroud)

events_table_inevents_table_out具有完全相同的架构。

简单解释一下,我遍历 的记录events_table_in,操作记录并希望以events_table_out以下方式追加(插入)操作的记录:

OPEN recCurs FOR execute 
format('SELECT * FROM %s order by session_id, event_time', event_table_in);

LOOP
    FETCH recCurs into rec;
    if not found then
      exit;
    end if;

    -- 1. do something with rec

    -- 2. insert the rec into events_table_out

end loop;
Run Code Online (Sandbox Code Playgroud)

我怎样才能保存recevents_table_out

postgresql insert plpgsql functions record

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

如何使 PL/pgSQL 中的查询运行时与控制台查询运行时一样快?

基本上我想将查询结果分配给自定义类型属性。但是我注意到直接从 PostgreSQL 控制台查询大约需要 0.071 毫秒,并且在几次调用后函数内部为 0.400 毫秒和 0.170 毫秒。explain analyze甚至显示了第一种情况下索引的使用情况,但没有显示第二种情况。

这就是我正在做的。

CREATE OR REPLACE FUNCTION fun_isliked(
    par_client client.id%type,
    par_feed feed.id%type
)
RETURNS boolean
AS
$$
BEGIN
    RETURN (
        EXISTS(
            SELECT
                1
            FROM
                feedlike fl
            WHERE
                fl.client = par_client
                AND fl.feed = par_feed
                AND fl.state = 1
        )
    );
END;
$$ LANGUAGE plpgsql STABLE;
Run Code Online (Sandbox Code Playgroud)

以下是上述explain analyze两种情况的输出:

postgres=# explain analyze select exists (select 1 from feedlike where client = 13 and feed = 68 and state = 1); …
Run Code Online (Sandbox Code Playgroud)

postgresql performance plpgsql query-performance

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

如何在 plpgsql 中执行 WHERE x IN (val1, val2,...)

我想更新表中的行选择;这有效...

UPDATE t1 SET col1 = 'newvalue' WHERE col0 in (2, 4, 5);
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在 plpgsql 函数中做同样的事情呢?下面给出了一个语法错误...

CREATE OR REPLACE FUNCTION foo(intarray int[])
RETURNS VOID AS 
$BODY$

BEGIN
  UPDATE t1 SET col1 = 'newvalue'
  WHERE col0 in intarray;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

错误...

ERROR:  syntax error at or near "intarray"
LINE 7:       WHERE col0 in intarray;
Run Code Online (Sandbox Code Playgroud)

编辑:

如果我们更换in intarray;in (intarray);的功能被记录,但在运行时SELECT * FROM foo(ARRAY[1,3,5])的误差变...

ERROR:  operator does not exist: integer = integer[]
LINE 2:       WHERE …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql array

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