2016-08-19 5 views
1

Ich habe ein Problem mit der Verwendung von Parameter in PSQL. Wie Sie den Parameter in where-Klausel richtig verwenden. Es gibt keine Fehler beim Kompilieren der Prozedur, die ich unten aufgeführt habe. Aber keine Ergebnisse, wenn ich 'Bla Bla Bla' String übergeben.Verwendung von Parameter in 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 

Aber, wenn ich ausführen dieses Verfahren durch die Parameter zum Beispiel ersetzt:

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 

ich Ergebnisse richtig zu bekommen. Fehle ich etwas, wie kann ich es funktionieren lassen?

EDIT: Ok, hier ist noch eine Sache. Dieses Verfahren:

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 

Gibt mir richtige Ergebnisse zurück. Gibt es eine Möglichkeit, die Zeichenfolge "T" stattdessen "(paramTXT, paramTXT1)" zu verwenden, und das kann mir Ergebnisse liefern?

Antwort

3

In Ihrer ersten Version, verketten Sie zwei Strings, die in folgenden Zeichenfolge führen:

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

Sie sehen, dass es um die Zeichenfolge bla bla bla keine Anführungszeichen sind, so sollte der Motor es als Spaltennamen behandeln und in der Regel Dies sollte zu einem Fehler wie "Spalte bla bla bla nicht gefunden" oder ähnliches führen. Wenn Sie einen Wert eingeben, der mit einem bestimmten Spaltennamen übereinstimmt, erhalten Sie eine leere Ergebnismenge, sofern keine Zeile (n) vorhanden ist, in der die beiden Spalten den gleichen Wert haben.

es zu beheben, verwenden parametrisierte Anweisung:

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

die documentation für die vollständige Syntax des execute statement sehen.

+0

Ich habe Frage (Beispiel oben) bearbeitet, manchmal wäre es nicht nur ein Parameter, also dachte ich, dass es gut sein könnte, etwas wie String als Parameter zu verwenden. Ist es möglich? –

+0

Nicht bei parametrisierter Anweisung. Sie könnten sie mit der Anweisung verketten (wie Ihr allererstes Beispiel, aber achten Sie darauf, Anführungszeichen um die: TXT hinzuzufügen), aber das ist unsicher, besser, parametrisierte Anweisung zu verwenden. – ain

Verwandte Themen