2015-09-30 2 views
1

Я пишу модульный тест для своих функций PostgreSQL. Это начинается с вставки данных в базу данных и последующего вызова определенной функции. Однако, поскольку я использую автоинкрементные идентификаторы, я не могу знать, какой параметр нужно включить в мой вызов функции.Использование переменных в скрипте 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/how-to-get-a-value-from-the-last-insert-row Убедитесь, что вы используете драйвер 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 
    ; 

Кроме того, для более мелких вещей, которые вы могли бы использовать \gset команду Psql в: (link to documentation)

+0

Конечно, так же просто, как' SELECT myFun (id) FROM table'. Должен был подумать об этом сам. –

1

INSERT в Postgres возвращает идентификатор объекта, который вы можете получить в ряде способов

  • Использование возвращающегося положение в обычном SQL, например

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

  • с использованием GET DIAGNOSTICS API в PL-PGSQL

  • с использованием функции возврата в библиотеку помощника (в зависимости от синтаксиса библиотеки).

В вашем случае, вы могли бы сделать что-то вроде

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

Я использую простой скрипт SQL, никаких библиотек, просто что-то по строке 'psql

+0

ОК, уточнили ответ –

+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$$; 
Смежные вопросы