在 PSQL 中使用参数

Using parameter in PSQL

我在 psql 中使用参数时遇到问题。 如何正确使用where子句中的参数。 编译我在下面列出的程序没有错误。 但是当我传递 'bla bla bla' string.

时没有结果
CREATE PROCEDURE SELECTCATALOGUE (
 TXT  VARCHAR(30))
RETURNS (
 CODE VARCHAR(9),
 NAME VARCHAR(50))
AS 
BEGIN     
for execute statement
'select code,name
            from catalogue
            where name='||:TXT
into :CODE,:NAME
do 
   suspend;
END

但是,当我通过替换参数执行此过程时,例如:

CREATE PROCEDURE SELECTCATALOGUE (
 TXT  VARCHAR(30))
RETURNS (
 CODE VARCHAR(9),
 NAME VARCHAR(50))
AS 
BEGIN     
for execute statement
'select code,name
            from catalogue
            where name=''bla bla bla'''
into :CODE,:NAME
do 
   suspend;
END

我得到的结果是正确的。我是否遗漏了什么,如何让它发挥作用?

编辑: 好的,还有一件事。本程序:

CREATE PROCEDURE SELECTCATALOGUE
RETURNS (
 CODE VARCHAR(9),
 NAME VARCHAR(50))
AS 
declare variable stmt varchar(1000);
declare variable paramTXT varchar(100);
declare variable paramTXT1 varchar(100);
declare variable T varchar(1000);
BEGIN     
paramTXT='PLO'||'%';
paramTXT1='REM'||'%';
T='paramTXT,paramTXT1';
stmt='select code,name
            from catalogue
            where name like ? or name like ? order by name';
for execute statement (
  stmt
)
            (paramTXT,paramTXT1)
into :CODE,:NAME
do 
   suspend;
END

返回正确的结果。有没有一种方法可以使用 "T" 字符串代替“(paramTXT,paramTXT1)”并且可以给我结果?

在您的第一个版本中,您连接了两个字符串,结果是以下字符串:

select code,name from catalogue where name=bla bla bla

您看到字符串 bla bla bla 周围没有引号,因此引擎应将其视为列名,通常这会导致 "column bla bla bla not found" 等错误。如果碰巧您发送的值与某些列名匹配,那么您将得到空结果集,除非存在两列具有相同值的行。

要修复它,请使用参数化语句:

for execute statement (
   'select code,name
            from catalogue
            where name = :parName')
   (parName := TXT)
   into :CODE,:NAME
do 

有关 execute statement 的完整语法,请参阅 documentation