标签: plpgsql

postgresql:在动态命令中使用 NEW.* 执行 EXECUTE

我尝试为 postgresql 8.3 创建一个 plpgsql 触发器,它在通过 id 列插入之前自动对表进行分区

如果目标表不存在,它将被创建,然后插入到那里

所以我用这样的新表名创建了插入语句

exec_insert := 'INSERT INTO '||TG_TABLE_SCHEMA||'.'||TG_RELNAME||'_'||destinationid||' VALUES('||NEW.*||')';
EXECUTE exec_insert;
Run Code Online (Sandbox Code Playgroud)

导致错误:

ERROR:  NEW used in query that is not in a rule
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 甚至可以在 EXECUTE 中使用 NEW 还是语句中有错误?
  2. 如果这是不可能的,有人知道如何从 NEW 中获取值,以便我可以在语句中使用它们吗?我唯一想到的是使用 information_schema 检索主表的列名,然后尝试动态访问 NEW 的值 - 我也不知道如何:(

谢谢

postgresql inheritance triggers partitioning plpgsql

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

Java 求和 2 个负数

我正在尝试将 java 中的函数转换为 pl/pgsql,我发现的一个问题是当我尝试对 2 个负数求和并得到一个正数时,更具体地说:

public void sum(){
    int n1 = -1808642602;
    int n2 = -904321301;
    System.out.println(n1 + n2);// result is 1582003393
}
Run Code Online (Sandbox Code Playgroud)

在 pl/pgsql 中,我得到一个整数超出范围错误,如果我将变量类型更改为 bigint,我会得到 2 个负数的正常总和,即 -2712963903,而不是 1582003393

如何在不打印整数超出范围错误的情况下获得相同的结果 pl/pgsql?

java sum plpgsql negative-number

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

在 Java 中,调用 PostgreSQL 函数时,为什么会收到错误消息,告知该函数不存在?

我在数据库中有这个程序:

CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$
BEGIN
INSERT INTO pageRelevance VALUES (id,value);
EXCEPTION WHEN unique_violation THEN
    UPDATE pageRelevance SET relevance = value WHERE pageId = id;       
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

以及调用此函数的这段代码:

try (CallableStatement cstm = conn.prepareCall(PAGE_RELEVANCE_SQL)) {
        for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) {
            cstm.setInt(1, entry.getKey());
            cstm.setDouble(2, entry.getValue());
            cstm.addBatch();
        }
        cstm.executeBatch();
    } catch (SQLException e) {
        LOGGER.error("Error discovering pages relevance: " + e.getNextException());
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,我收到一个错误通知function replacepagerelevance(integer, double precision) doesn't exists.。为什么? …

java postgresql stored-procedures sqlexception plpgsql

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

返回 plpgsql 函数插入的记录

我有一个在 postgres 中执行 plpgsql 函数的 cron 作业。此函数将零到多条记录插入表中。返回由函数创建的记录作为结果的最佳方法是什么?

我正在使用 PostgreSQL 9.1

sql postgresql plpgsql sql-insert postgresql-9.1

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

PostgreSQL 中带有字符串的 For 循环

在这里,我试图连接一个字符串,:

CREATE FUNCTION looping() RETURNS TABLE(round text)
DECLARE
  i RECORD;
BEGIN

FOR i IN select regexp_split_to_table('33,55,66,88', ',') as "asd"
LOOP
  str:= str || ',' ||(select  i."asd");
END LOOP;

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

这是真的还是我错过了什么?

postgresql loops plpgsql

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

调用返回记录的 Postgres 函数,传入查询结果

问题是我需要运行一个查询(仅在运行时知道)来确定我的函数的输入参数,它需要返回一个结果。例如,我想写:

CREATE FUNCTION foo(inputKey INT) RETURNS TABLE (c0 INT, c1 TEXT) AS $$
    BEGIN
        -- Do something with inputKey to compute and return result
    END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

这些是我迄今为止尝试过的查询:

-- Doesn't even run (exception)
SELECT * FROM foo(SELECT foreignKey FROM someTable WHERE primaryKey = 5);

-- Runs, but returns a single column with all columns listed in it's value
SELECT foo(foreignKey) FROM someTable WHERE primaryKey = 5;

-- Same problem as previous
SELECT * FROM (SELECT foo(foreignKey) FROM someTable WHERE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql function plpgsql postgresql-9.3

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

PostgreSQL 函数/存储过程 CURRENT_TIMESTAMP 不会改变

我想跟踪函数内的执行时间。例如,我有以下状态跟踪表:

    CREATE TABLE status_table
    (
    run_id numeric NOT NULL,
      start_ts timestamp(6) without time zone NOT NULL,
      end_ts timestamp(6) without time zone NOT NULL
    )
WITH (
  OIDS=FALSE
)
DISTRIBUTED RANDOMLY;
Run Code Online (Sandbox Code Playgroud)

我有以下示例函数,它使用 PG_SLEEP(5) 作为对我的函数实际执行操作的模拟:

CREATE OR REPLACE FUNCTION wrapper_func(p_run_id numeric)
  RETURNS numeric AS
$BODY$
Declare  
tmp_start_ts timestamp(6) without time zone;
tmp_end_ts timestamp(6) without time zone;

BEGIN
tmp_start_ts := CURRENT_TIMESTAMP;
PERFORM PG_SLEEP(5);
tmp_end_ts := CURRENT_TIMESTAMP;
INSERT INTO status_table (run_id,start_ts,end_ts) VALUES (p_run_id,tmp_start_ts,tmp_end_ts);
RETURN 0;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

I then called this …

postgresql plpgsql

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

PostgreSQL 函数返回表或 SETOF

快速背景:PostgreSQL 非常新,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问题,但仍然找不到解决方案。

我有这个选择语句,我每周执行一次以返回新值

select distinct id, null as charges
     , generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)
Run Code Online (Sandbox Code Playgroud)

我能做些什么来把它变成一个我可以右键单击并每周执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此,它将在没有用户参与的情况下执行并将结果以电子表格的形式发送给用户。不确定最后一部分是否对函数的编写方式很重要。

这是我多次失败的尝试之一:

CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
             , chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
     , generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql stored-procedures plpgsql

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

如何执行PostgreSQL'获取诊断'

PostgreSQL 9.3手册描述了这个命令

'GET DIAGNOSTICS int_var = ROW_COUNT;' 
Run Code Online (Sandbox Code Playgroud)

从最后一个insert/update命令获取受影响行的计数.当我在GUI(pgAdmin 3,SQL编辑器窗格)和Python(使用psycopg2包)中尝试此操作时,我收到此错误:

ERROR: syntax error at or near "GET".
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sql postgresql plpgsql

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

Postgres对象数组错误`错误:无法确定多态类型,因为输入类型为"unknown"

我一直试图在postgres中循环一个对象数组.但是,我反复收到错误error: could not determine polymorphic type because input has type "unknown".我认为这与我传递给看起来像这样的函数的值有关.

[
  {
    "number": 1,
    "letter": "a"
  },
  {
    "number": 2,
    "letter": "b"
  }
]
Run Code Online (Sandbox Code Playgroud)

功能如下.我已经制作了类型ANYARRAY,我认为它应该完全按照名称暗示.我不介意有更具体的选择.

CREATE OR REPLACE FUNCTION "CheckArrayOfObjects" (
  "@arrayOfObjects"           ANYARRAY
)
RETURNS void AS
$func$
DECLARE "e" JSONB;
BEGIN
  FOR "e" IN json_array_elements("@arrayOfObjects")
  LOOP
    RAISE NOTICE 'Checking Item %', "e";
  END LOOP;
END;
$func$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

我也尝试过FOREACH,但它并没有更好.我认为问题在于传入的值,所以不确定修改循环是否会做任何事情.

arrays postgresql json plpgsql jsonb

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