복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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이 동적으로 빌드 문을 출력합니다 ..

  4. from https://stackoverflow.com/questions/23178816/mysql-dynamic-query-in-stored-procedure by cc-by-sa and MIT license