2016-08-19 4 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 

. 나는 뭔가를 놓치고, 어떻게 작동 시키는가?

편집 : 여기에 한 가지 더 있습니다. 이 절차 :

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)"을 사용하는 방법이 있습니까? 그 결과를 얻을 수 있습니까? 당신이 문자열 bla bla bla 주위에 따옴표 없기 때문에 엔진이 일반적으로 열 이름으로 취급해야한다고 볼

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

:

첫 번째 버전에서

답변

3

, 당신은 문자열을 다음과 같은 결과 두 개의 문자열을 연결 이 경우 "열 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를 참조하십시오 그것을 해결하기 위해

는, 매개 변수가있는 SQL 문을 사용합니다.

+0

질문 (예 : 위의 예)을 편집 한 적이 있는데 때로는 단 하나의 매개 변수가 아니므로 문자열과 같이 매개 변수로 전달하는 것이 좋을 것이라고 생각했습니다. 가능한가? –

+0

매개 변수화 된 문을 사용하지 않습니다. 첫 번째 예와 같이 명령문에 연결할 수 있지만 (: TXT) 따옴표를 추가하는 데주의를 기울이지 만 안전하지 않으므로 매개 변수화 된 명령문을 사용하는 것이 좋습니다. – ain