如何将参数从 bat 文件或命令行传递给 plpgsql 函数?

Posted

技术标签:

【中文标题】如何将参数从 bat 文件或命令行传递给 plpgsql 函数?【英文标题】:How to pass parameters from a bat file or a command line to a plpgsql function? 【发布时间】:2017-10-30 02:22:26 【问题描述】:

这是我的 sql 代码:

create extension if not exists dblink;

drop function if exists  func_statistic(host varchar(32),port varchar(32),username varchar(32),password varchar(32));
create or replace function func_statistic(host varchar(32),port varchar(32),username varchar(32),password varchar(32)) returns int as
$$
declare v_dbname text;
declare v_dest_file text;
declare v_connect_info text;
declare v_sql_str text;
begin
   ......
end;
$$ language plpgsql;


select func_statistic(:host,:port,:username,:password);

我在蝙蝠中写了这个:

psql -U %user% -h %host% -p %port%  -v host=%host% -v port=%port% 
-v username=%user% -v password=%PGPASSWORD% -c %sql_file% cmsdb 

这是错误的。我不能以这种方式将参数传递给 .sql 文件的函数。您知道如何将参数传递给 plpgsql 函数或为什么不能传递吗?非常感谢。

【问题讨论】:

【参考方案1】:

可能在这种情况下使用-c 选项是错误的。可能您应该使用-f 选项或阅读stdin。文本参数应在撇号之间进行转义和关闭,语法为 :'varname'

CREATE OR REPLACE FUNCTION public.fx(text)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
begin
  raise notice '>>%<<', $1;
end;
$function$

[oracle@ora2pg migrace]$ echo "select fx(:'xxx')" | psql -v xxx='aaaaa bbbb'
Time: 1,962 ms
Debug assertions "off"
NOTICE:  >>aaaaa bbbb<<
┌────┐
│ fx │
╞════╡
│    │
└────┘
(1 row)

【讨论】:

是的,你是对的。谢谢你。总而言之,我应该在两个地方更改我的代码。一个是将 "-c %sql_file% " 更改为 "-f %sql_file%" ,另一个是将 "func_statistic(:host,:port,:username,:password)" 更改为 "func_statistic(:'host',:'端口',:'用户名',:'密码')".

以上是关于如何将参数从 bat 文件或命令行传递给 plpgsql 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从 gradle exec 任务传递到命令行

将命令行参数和文本文件传递给程序

如何将任意命令行参数从 MinGW shell 传递给本机 Windows 程序?

如何将命令行参数从pytest传递给代码

将命令行参数输入文件传递给要解析的类

如何将参数(不是命令行参数)传递给批处理脚本中的函数