在PSQL中使用参数

时间:2016-08-19 17:28:53

标签: sql firebird

我在psql中使用参数时遇到问题。 如何在where子句中正确使用该参数。 编译我在下面列出的过程没有错误。 但是当我通过“bla bla bla'字符串。

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)"那会给我带来什么结果?

1 个答案:

答案 0 :(得分:3)

在第一个版本中,您连接两个字符串,这些字符串会产生以下字符串:

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

您看到字符串bla bla bla周围没有引号,因此引擎应将其视为列名称,通常这会导致错误,例如"未找到列bla bla bla&#34 ;或者其他一些。如果您发送的值与某个列名匹配,那么除非存在两列具有相同值的行,否则您将获得空结果集。

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

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

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