2016-08-19 12 views
1

psqlでパラメータを使用する際に問題があります。 where句でパラメータを正しく使用する方法。 下記の手順をコンパイルする際にエラーはありません。 「bla bla bla」の文字列を渡すと結果はありません。PSQLでパラメータを使用する

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 

。私は何かを逃している、それを動作させる方法は?

編集: ここでもう1つのことがあります。この手順:

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 

正しい結果が返されます。代わりに "(paramTXT、paramTXT1)"という文字列を "T"文字列に使用する方法がありますか?結果が得られますか?あなたがそこに文字列bla bla blaの前後に引用符ではありませんので、エンジンは通常、列名として扱いとすべきであることがわかり

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

あなたの最初のバージョンで

答えて

3

、あなたは文字列の次につながる2つの文字列を連結しますこれにより、「列bla bla bla not found」などのエラーが発生するはずです。ある列名と一致する値を送信した場合、2つの列が同じ値を持つ行がない限り、空の結果セットを取得します。

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

execute statementの完全な構文についてはdocumentationを参照してください。それを修正する

は、パラメータ化されたステートメントを使用します。

+0

私は質問を編集しました(上記の例)、時には1つのパラメータだけではないので、パラメータとして渡す文字列のようなものを使うのが良いかもしれないと思った。出来ますか? –

+0

パラメータ化された文を使用していません。最初の例のようにステートメントに連結することができますが、:TXTの前後に引用符を追加することに注意してください。しかし、これは安全ではなく、パラメータ化されたステートメントを使用する方が良いです。 – ain

関連する問題