[SQL] 저장 프로 시저에서 MySQL의 동적 쿼리
SQL저장 프로 시저에서 MySQL의 동적 쿼리
내가 저장 프로 시저에서 동적 쿼리를 만드는 오전. 다음과 같이 내 저장 프로 시저입니다 :
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team);
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
때 나는 다음과 같은 호출을 실행하려고 :
call test1 ('Test','SPA');
나는 다음과 같은 오류 메시지가 나타납니다 :
나는 조건과 잘 작동,하지만이 작동하지 않는 경우 조건, 난 변수 이름 @를 사용하여 시도 곳없이 테스트하지만 여전히 작동하지 않습니다.
당신의 도움을 주셔서 감사합니다.
해결법
-
==============================
1.당신은 WHERE 절에 따옴표를 놓쳤다.
당신은 WHERE 절에 따옴표를 놓쳤다.
이 같은 시도 :
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
설명:
코드에서 쿼리처럼 될 것입니다 :
SELECT * FROM Test where team=SPA
그리고 우리는 그것을 할 수 변경 :
SELECT * FROM Test where team='SPA'
-
==============================
2.따옴표 안에 묶으 입력 문자열을하지 않는 경우에 발생하고, SQL 엔진은 테이블의 열이 조회되는로 식별하려고합니다. 그것을 찾을 수 없습니다하지만 실패합니다.
따옴표 안에 묶으 입력 문자열을하지 않는 경우에 발생하고, SQL 엔진은 테이블의 열이 조회되는로 식별하려고합니다. 그것을 찾을 수 없습니다하지만 실패합니다.
이 같은 열을 발견하지만 무슨 일? 이 열 값에 약간의 일치를 발견 할 때 결과를 가져옵니다. 분명히 이것은 하나가 기다리고 있었다 것이 아니다.
이 문제를 어떻게 극복하기 위해? 동적 입력 값 준비 문을 사용.
당신은 같은 자리를 사용할 수 있습니까? 프로 시저 너무 동적 입력 값에 준비 제표를 사용한다. 할당 또는 SQL 표현식에서 비교했을 때 엔진은 이스케이프 문자 및 기타 문자열 값을 처리합니다.
필요에 따라 단지, 하나 개 이상의 세션 변수에 재 할당 절차를 입력해야합니다.
프로 시저의 예제 :
CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) ) BEGIN SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder SET @w_team := w_team; PREPARE stmt3 FROM @t1; EXECUTE stmt3 USING @w_team; -- <-- input for placeholder DEALLOCATE PREPARE stmt3; END;
-
==============================
3.이 시도..
이 시도..
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40)) BEGIN SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'"); PREPARE stmt3 FROM @t1; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; END
당신은 w_team 변수에 따옴표가 누락되었습니다 ..
당신은 동적으로 인쇄 문을 바로 복사 할 수 있도록 구축하고 쉽게 이런 종류의 문제를 찾을 수 있도록 노력하는 성명을 인쇄해야합니다.
선택 @ T1이 동적으로 빌드 문을 출력합니다 ..
from https://stackoverflow.com/questions/23178816/mysql-dynamic-query-in-stored-procedure by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 날짜에 SQL 서버 변환 문자열 (0) | 2020.05.04 |
---|---|
[SQL] MySQL의 오류 1241 : 피연산자 1 열을 포함해야합니다 (들) (0) | 2020.05.04 |
[SQL] 어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면? (0) | 2020.05.04 |
[SQL] SQL에서 대문자로 분할 단어 (0) | 2020.05.04 |
[SQL] 어떻게 총칭 SQL Server 쿼리를 사용하여 정렬 할 수 있나요 A '버전 번호'열 (0) | 2020.05.04 |