2017-10-26 13 views
0

여러 IBM iSeries 상자에서 실행중인 DB2를 처음 사용했습니다. 키 필드가 매개 변수의 값으로 시작하는 테이블에서 값을 선택하는 저장 프로 시저를 작성하는 데 어려움이 있습니다. 변수가있는 DB2 LIKE 연산자

지금 MS SQL 서버의 I는 이것을 작성합니다 : 내 DB2 proc 디렉토리에 대한 그래서

SELECT field FROM table WHERE fieldB like parm + '%' 

를 내가 가지고 :

SELECT field FROM table WHERE fieldB like parm || '%' 

내가 IBM 설명서 만에뿐만 아니라이 구문을 발견 몇 가지 SO 질문 및 답변. 그래서 와일드 카드 문자를 매개 변수 값에 연결하는 방법을 이해합니다. 나는 심지어뿐만 아니라 다음을 수행하려고했습니다

[SQL0104] Token PARM was not valid. Valid tokens: FOR NOT CCSID NORMALIZED.

: 내 CREATE PROCEDURE 문을 실행할 때

불행하게도, 나는 다음과 같은 오류가 발생

SET [*some declare variable*] = parm|| '%' 

SET srch = CONCAT(parm, '%'); 

WHERE 절의 CONCAT 함수 사용 :

WHERE fieldB like CONCAT(parm, '%'); 

각각 동일한 오류가 반환됩니다.

그래서 내가 뭘 잘못하고 있을까요?

+0

시스템의 버전이 무엇인지 알고 계십니까? –

+0

예. 대부분 V7R2를 실행 중이지만 V6R1을 실행중인 V7R2가 하나 이상 있습니다. 결국 모든 시스템이 V7R2에 탑재 될 것입니다. –

답변

2

가 잘 작동합니다 ... 코드없이 나는 당신이 정확히 말할 수 없다 잘못 입력하면 ...

커서를 명시 적으로 선언해야만 Db2에 설정된 결과가 반환됩니다. SELECT INTO를 사용하지 않으므로 select가 여러 행을 반환한다고 가정합니다.

CREATE OR REPLACE PROCEDURE cwilt.myproc(IN parm char(128)) 
    LANGUAGE SQL 
    BEGIN 
     DECLARE myRS cursor with return to client for 
      select table_name 
      from systables 
      where table_name like trim(parm) concat '%'; 

     open myRS; 

    END; 

call cwilt.myproc(char('SYP')); 
+0

에서는 작동하지 않습니다. 또한 필자의 입력 내용이 11 자임을 인식 했으므로 일치 항목이 제대로 작동하는지 확인해야했습니다. –

+1

사용자가 11자를 입력 할 수 있다고 가정하면 12 % 이상의 변수를 선언하여 '%'의 여유 공간을 만들 수 있습니다. 그렇지 않으면 런타임 오류가 발생할 수 있습니다. – Charles

0

필드를 SELECT FROM 테이블에서 시도해보십시오. || IBM 문서에 따라 '%'

나는 나의 iSeries의이 사용하고 그것을 작동합니다 :

https://www.ibm.com/support/knowledgecenter/SSEPGG_9.8.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0020295.html

+0

감사합니다. 그러나, 그것은 내 proc을 업데이트하는 방법이었을 것입니다. 여러 변경 사항을 테스트하기 위해 ALTER PROCEDURE를 사용했습니다. 그러나 proc을 삭제하고 CREATE PROCEDURE를 사용하면 오류가 발생하지 않습니다. –

+1

"인라인"SQL 문이라고 부르는 매개 변수 표식은 작동하지만 완벽하게 작동하는 저장 프로 시저 –