【问题标题】:Using variables in SQL script在 SQL 脚本中使用变量
【发布时间】:2015-09-30 15:08:04
【问题描述】:

我正在为我的 PostgreSQL 功能编写单元测试。首先是在数据库中插入数据,然后调用某个函数。但是,因为我使用自动递增的 ID,所以我不知道要在函数调用中放入什么参数。

我希望能够做这样的事情:

INSERT INTO myTable ...;

SELECT id FROM myTable INTO l_id;

SELECT my_function(l_id);

更新

  • 我使用的是 SQL 脚本,而不是 PL/pgSQL
  • 在 MySQL 中我可以这样做:SELECT @id:=itemid FROM myTable;,然后我可以在任何我喜欢的地方使用@id

【问题讨论】:

  • 如果您使用的是 Java:请参阅 stackoverflow.com/questions/241003/… 确保您使用的是 JDBC 4 驱动程序。
  • 问题是没有得到最后一个 ID(只有一个,所以没有问题)。问题是如何SELECT 一个值并稍后在脚本中使用它。
  • 将其存储到结果表中并在需要时检索它?
  • @wildplasser 我如何检索它,以便在SELECT my_function() 调用中使用它们?
  • @BartFriederichs:看我的回答

标签: postgresql


【解决方案1】:
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE mytab
    ( id INTEGER NOT NULL PRIMARY KEY
    );
INSERT INTO mytab (id) SELECT gs FROM generate_series(1,10) gs;

CREATE OR REPLACE FUNCTION tmp.myfunc ( _int  integer )
RETURNS text AS
$func$

DECLARE ret text;

BEGIN
    ret = 'OMG_' || _int::text;
RETURN ret;
END;
$func$
LANGUAGE 'plpgsql'
    ;

SELECT myfunc(1);

SELECT myfunc(mt.id)
FROM mytab mt
    ;

另外,对于较小的事情,您可以使用 psql 的 \gset 命令: (link to documentation)

【讨论】:

  • 当然,就像SELECT myFun(id) FROM table一样简单。我自己应该想到的。
【解决方案2】:

Postgres 中的INSERT 返回一个 OID,您可以通过多种方式获得它

  • 在普通 SQL 中使用返回子句,例如

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING did;

  • 在 PL-PGSQL 中使用 GET DIAGNOSTICS api

  • 在帮助程序库中使用返回函数(语法取决于库)。

在你的情况下,你可以做类似的事情

with res as (
INSERT INTO my_table (id, ...) VALUES(x,..)
RETURNING id)
SELECT my_function(res.id);

【讨论】:

  • 我正在使用一个简单的 SQL 脚本,没有库,只是类似于 psql < test.sql 的东西。
  • 好的,已经明确了答案
  • 好的,我如何在函数调用中使用did?在一个普通的 SQL 脚本中?例如 MySQL 有 @ 变量。
  • 我找到了一个使用DO 块的解决方案,它也可以正常工作(似乎是某种匿名函数)
【解决方案3】:

Here 我发现提到了DO 块,它似乎是一个匿名函数。我是这样修复的:

INSERT ...

DO $$
DECLARE
    l_id integer;
BEGIN
    SELECT id FROM table INTO l_id;
    SELECT myFunction(l_id);
END$$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多