在 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。
我在 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。