2015-09-30 90 views
1

我正在爲我的PostgreSQL功能編寫單元測試。這從在數據庫中插入數據開始,然後調用某個函數。但是,因爲我使用自動遞增ID,所以我無法知道要在我的函數調用中放入什麼參數。在SQL腳本中使用變量

我希望能夠做這樣的事情:

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我喜歡的任何地方。
+0

如果您使用的是Java:看http://stackoverflow.com/questions/241003 /如何從最後插入的行中獲取值 確保您使用JDBC 4驅動程序。 –

+0

問題是沒有得到最後的ID(只有一個,所以沒有問題)。問題是如何「選擇」一個值並在腳本中稍後使用它。 –

+0

將它存儲到結果表中並在需要時檢索它? – wildplasser

回答

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)

+0

當然,作爲'SELECT myFun(ID)FROM table'一樣簡單。我自己應該想到這一點。 –

1

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); 
+0

我用一個簡單的SQL腳本,沒有圖書館,只是沿着PSQL

+0

OK,已經澄清了答案 –

+0

好了,我怎麼可以使用'did'在我的函數調用?在普通的SQL腳本中?例如MySQL對變量有'@'。 –

0

Here我發現DO塊,這似乎是一個匿名函數來工作的提。我固定它是這樣的:

INSERT ... 

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