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