我正在尝试通过 C# 的 Npsql 创建一个 stpored 过程
private async Task TestExecute(string cmdQuery)
{
var cnnString = $"Server=localhost;User Id=admin;Password=somepass;Database=MyTestdatabase";
NpgsqlConnection connection = new NpgsqlConnection(cnnString);
await connection.OpenAsync();
var cmdQuery2 = "CREATE OR REPLACE PROCEDURE public.select_data()" +
" LANGUAGE sql" +
" BEGIN ATOMIC" +
" SELECT tbl.id," +
" tbl.val" +
" FROM tbl;" +
" END";
// All of these fails
var r0 = await connection.ExecuteScalarAsync(cmdQuery2);
var r1 = await connection.ExecuteAsync(cmdQuery2);
var r2 = await connection.QueryAsync(cmdQuery2);
}
这是脚本:
CREATE OR REPLACE PROCEDURE public.select_data()
LANGUAGE sql
BEGIN ATOMIC
SELECT tbl.id,
tbl.val
FROM tbl;
END
从 pgAdmin 执行时效果非常好。但是,当我尝试使用任何执行/查询方法执行它时,出现此错误。
更有趣的是,我没有通过执行此脚本看到来自 pg 活动的命令:
SELECT query, * FROM pg_stat_activity
where query <> ''
order by query_start desc;
所以看起来 CREATE OR REPLACE 过程甚至在到达 Postgre 服务器之前就在某些验证级别失败。
顺便说一句,即使使用“ExecuteReaderAsync”,用于创建函数的类似脚本也能正常工作
CREATE OR REPLACE FUNCTION public.fn_add_values(a integer, b integer)
RETURNS integer
LANGUAGE sql
RETURN (a + b)
分号...一切都与分号有关。
你的sql看起来像这样:
CREATE OR REPLACE PROCEDURE public.select_data()
LANGUAGE sql
BEGIN ATOMIC
SELECT tbl.id,
tbl.val
FROM tbl
所以它是无效的。分号结束语句。
告诉 Npgsql 不要解析你的语句,或者只使用 Dollar-Quoted String Constants
CREATE OR REPLACE PROCEDURE ...
LANGUAGE plpgsql
AS $$
BEGIN
...
END;
$$