标签: plpgsql

如何使用 EXECUTE 在动态 SQL 中使用函数参数?

我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。

下面是我的功能:

CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state     text, district text, organizationId text, bloodGroup text, status text,   approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
  concat_ws(' AND '
    , CASE WHEN state IS NOT NULL THEN 'state = $2' END
    , CASE WHEN district IS NOT NULL THEN 'district = $3' END
    , CASE WHEN bloodGroup IS NOT NULL THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql parameter plpgsql postgresql-9.5

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

在postgresql函数中循环jsonb对象的键/值对

我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。

create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN

    // foreach(key in input)
    //       do some math operation on its corresponding value

    returns input;

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

参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.

我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。

postgresql plpgsql json

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

检查什么事件在 PostgreSQL 上调用了触发器?

我正在尝试检查什么事件称为我的触发器,例如INSERT,UPDATEDELETE

Oracle 触发器可以在一个简单的“IF”语句中进行检查:

IF INSERTING, IF UPDATING or even IF DELETING
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 上有类似的说法吗?

通常我只是创建一个函数 for INSERT,另一个 forUPDATE和一个 for DELETE,但如果有某种方法只创建一个函数,那就浪费了代码。

有人可以帮忙吗?

postgresql trigger plpgsql

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

PostgreSQL 8.4:如何判断是否安装了过程语言?

我有一个安装程序,需要 plpgsql 在 PostgreSQL 8.4 数据库中安装存储过程。我需要确保安装了语言,否则应用程序将失败。我不想放弃语言并重新添加它,因为这可能会搞砸其他一些事情。

有没有办法“轻轻”安装语言?
CREATE LANGUAGE IF NOT EXISTS似乎无效。

postgresql plpgsql functions postgresql-8.4 postgresql-extensions

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

错误:FOREACH 的循环变量必须是已知变量或变量列表

我的函数中几乎没有 FOREACH 循环。这些循环似乎与官方 postgresql 文档完全一致。返回此错误消息:

ERROR: loop variable of FOREACH must be a known variable or list of variables
SQL state: 42601
Run Code Online (Sandbox Code Playgroud)

谷歌没有找到任何关于postgresql "loop variable of FOREACH". 我以某种方式为我的旧 foreach 循环解决了这个问题,但我不记得如何解决,并且我找不到任何对于解决此错误可能重要的差异。

我在 Windows XP 32 位上有 PostgreSQL 9.3.4 和 pgAdmin III 1.18.1。以下是函数中有趣的部分:

CREATE OR REPLACE FUNCTION vloz_kont() RETURNS trigger AS $$
DECLARE
  _idmat integer;
  _nazmat text;
  _zast text;
  sj_nad text;
  ...
BEGIN

...

--bugged loop
FOREACH _mat IN ARRAY NEW._material::text[] LOOP
  SELECT split_part( _mat, ' ', 1 …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

Basic transactional DDL script in PostgreSQL

PostgreSQL newbie here trying to put together a transactional DDL script to atomically create a database and its schema in Postgres 9.3: in a transaction, create a few tables; if any errors, roll the whole thing back; otherwise commit. I'm having a hard time getting the syntax right, and I suspect my problems might stem from conflating SQL DDL with PL/pgSQL and/or not grokking the transaction semantics.

Long story short, what's the PL/pgSQL boilerplate for a script to do something …

postgresql transaction ddl plpgsql

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

函数使用两次时的 PL/pgSQL 问题(缓存问题?)

我面临一个绝对奇怪的问题,感觉更像是 Postgres 错误而不是算法问题。

我有这个功能:

CREATE FUNCTION sp_connect(mail character varying, passwd character varying, role character varying)
  RETURNS json LANGUAGE plpgsql STABLE AS
$$
DECLARE
    user_info record;
BEGIN
  IF role = 'Role1' THEN
    SELECT u.id, r.name INTO user_info
    FROM users u
    INNER JOIN users_roles ur ON ur.user_id = u.id
    INNER JOIN roles r ON ur.role_id = r.id
    WHERE u.email = mail
      AND u.password = encode(digest(CONCAT(passwd, u.password_salt), 'sha512'), 'hex')
      AND r.name = 'Role1';
  ELSIF role = 'Role2' THEN
    SELECT h.id, 'Role1' AS name …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql functions plan-cache postgresql-9.4

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

如何在 PL/pgSQL EXCEPTION 块中重新引发异常?

考虑函数内的以下(不完整的)PL/pgSQL 块:

CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
    RETURNS NUMERIC
    RETURNS NULL ON NULL INPUT
    IMMUTABLE
    LANGUAGE plpgsql
    AS $$
    BEGIN
        RETURN some_third_party_function(myvar1, myvar2);
    EXCEPTION WHEN internal_error THEN
        IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
            RETURN 0;
        ELSE
            -- Reraise the original exception here
            RAISE EXCEPTION '%', SQLERRM;
        END IF;
    END
    $$
Run Code Online (Sandbox Code Playgroud)

当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。

如何重新引发或重新抛出未修改的原始异常?

postgresql exception plpgsql

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

Postgres 存储函数的自定义错误代码类和编号

我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。

我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:

https://www.postgresql.org/docs/11/errcodes-appendix.html

我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。

是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?

postgresql error-handling plpgsql

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

在 json/jsonb 行上使用 IS DISTINCT FROM 触发而不进行比较逐项?

当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at = now();
    RETURN NEW;
  ELSE
    RETURN OLD;
  END IF;
END;
$$ language 'plpgsql';

CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)

当我插入包含 json 和 jsonb 列的表时,出现以下错误:

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql json postgresql-9.6

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