ПРИМЕЧАНИЕ: plsh
- это язык PostgreSQL, который выполняет команды оболочки.
Я пытаюсь вызвать функцию plsh
из функции plpgsql
.
Сначала есть большая функция plpgsql
:
CREATE OR REPLACE FUNCTION my_schema.big_function(my_arg character varying)
RETURNS text AS
$BODY$
BEGIN
DROP TABLE IF EXISTS backend.table_B;
CREATE TABLE backend.table_B AS
--Create a table with a SELECT with some joins,
--right now the resulting table is empty
RAISE NOTICE 'table_B created';
PERFORM my_schema.insert_from_shell(my_arg);
RETURN 'Function Ended';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Затем есть функция plsh
:
CREATE OR REPLACE FUNCTION my_schema.insert_from_shell(my_arg character varying)
RETURNS text AS
$BODY$
#!/bin/sh
PGPASSWORD=mypassword psql -d mydatabase -h myhost -p myport -U myuser -c "INSERT INTO myschema.table_A(mycolumn) VALUES('$1')"
$BODY$
LANGUAGE plsh VOLATILE
COST 100;
Когда я пытаюсь выполнить следующее:
SELECT my_schema.big_function('test');
это никогда не заканчивается.С другой стороны, если я прокомментирую строку PERFORM
из первой функции и вызову обе функции по отдельности, каждая из них завершится менее чем за секунду:
SELECT my_schema.big_function('test');
SELECT my_schema.insert_from_shell('test');
Может быть проблема с выполнением plsh
функций из plpgsql
функций, но я не уверен.
Я мог бы обойти это, вызывая обе функции по отдельности, используя скрипт вне базы данных, но я бы лучше решил его из базы данныхи вызовите одну функцию.
Любой указатель или помощь будет принята с благодарностью.