postgresql - PostrgreSQL 尝试执行 plsh 函数
问题描述
注意: plsh
是一种执行 shell 命令的 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
,但我不确定。
我可以使用数据库外部的脚本分别调用这两个函数来解决它,但我宁愿从数据库内部解决它,并调用一个函数。
任何指针或帮助将不胜感激。
解决方案
假设事务中的触发器在 上big_function
放置了一个冲突的锁table_a
,如评论中所建议的,您可以考虑以下解决方案:
使触发器 a CONSTRAINT TRIGGER
(它必须是AFTER
触发器)并将其声明为DEFERRABLE INITIALLY DEFERRED
. 然后它不会在触发语句运行时正确运行,而是会延迟到COMMIT
事务结束时。
到那时,insert_from_shell
已经完成并提交,所以不会出现死锁。
推荐阅读
- python - python tkinter 文本框控制台输出总是在最后一行?
- kotlin - 如何使用kotlin在列表中的每个项目内打印数字循环
- shell - 如何在shell脚本中更改环境变量的值
- php - VSCode语言服务器php验证不当
- python - 之前所有值的列值平均值
- java - 使用 rmi 时出现 java.net.ConnectException
- java - org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 糟糕的 SQL 语法
- c++ - lambda 中的 [capture] 是什么?
- r - 从数据框中行的每个元素中减去行的最小值,
- android - 在android studio中并排放置的两个垂直线性布局之间添加图像视图的问题