2014-03-13 7 views
0

쿼리 결과를 반환하지만 변수 중 하나를 NULL로 설정하는 저장된 proc 파일이 있습니다.MySQL의 저장된 프로 시저 변수가 NULL을 반환합니다.

 
select @CLIENT_ID3,@BEGIN_RANGE,@LATEST_INVOICE_ID; 

내가 얻을 : 나는 또한 시도

 
12345,2342342234,NULL 

: 나는 SP를 실행하면, 다음 결과를 선택

 
    CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
    BEGIN 
     DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
     select client_id into @CLIENT_ID3 from clients where 
client_id = CLIENT_ID limit 1; 
     SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1); 

     SELECT latest_invoice_id into @LATEST_INVOICE_ID from 
SQL_AuditPro.clients where client_id = CLIENT_ID; 
    END 

: 여기

은 SP입니다

 
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
BEGIN 
    DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
    select client_id into @CLIENT_ID3 from clients 
where client_id = CLIENT_ID limit 1; 
    SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1); 

    SET @LATEST_INVOICE_ID = (SELECT latest_invoice_id from 
SQL_AuditPro.clients where client_id = CLIENT_ID); 
END 

같은 결과입니다. 분명히 테스트를 위해 거기에있는 @ CLIENT_ID3을 SET 할 필요가 없습니다. 이 아이디어가 변수를 설정하지 않는 이유는 무엇입니까? 나는 그 자체로이 쿼리를 실행하면 나는 결과를 얻을, 나는 실행하는 경우 :

 
SELECT latest_invoice_id into @LATEST_INVOICE_ID from 
SQL_AuditPro.clients where client_id = 12345; 
select @LATEST_INVOICE_ID; 

내가 얻을 : 나는 그것을 선언, 변수를하지 선언 시도

 
2342342234 

, 그리고 그냥 SP가 완료된 후에이 변수가 범위를 벗어나는 것처럼 보이지만 다른 두 변수는 그렇지 않습니다.

도움을 주셔서 감사합니다.

답변

0
select client_id into @CLIENT_ID3 from clients where client_id = CLIENT_ID limit 1; 
                   ^---- missing @ 

SET @LATEST_INVOICE_ID = (SELECT [..snip..] where client_id = CLIENT_ID); 
                   ^--missing @ as well 

작성된 것처럼, 둘 다 자체 평등성 테스트로 해석됩니다. where 1 = 1. mysqld가 =의 어느 한쪽에있는 client_id이 저장된 proc에 전달한 매개 변수가 될 것이라는 것을 mysql이 알 수있는 방법이 없기 때문에 client_id는 필드 이름으로 취급 될 것이다.

두 번째 쿼리는 여러 행의 데이터를 반환하므로 그 결과를 단일 변수에 할당하려고하면 결과가 NULL이됩니다.

0

하나 이상의 테이블 열과 일치하도록 인수 이름을 정의한 경우 SQL 문에서 열 수식어를 사용하여 인수 이름과 구별해야합니다. 그렇지 않으면 인수 값으로 처리되고 대체됩니다.

는 조건으로 client_id = CLIENT_ID는 원인이되었다, 귀하의 경우에는

SQL Fiddle Example을 참조하십시오 (아마도)가 아닌 커서 유형의 변수에 할당 할 수없는, 여러 레코드를 가져. 따라서 사용자 정의 변수의 기본값 인 NULL이 리턴되었습니다.

은 아래 프로 시저 본문을 변경

:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 
BEGIN 
    DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0; 
    select c.client_id into @CLIENT_ID3 
    from clients c 
    where c.client_id = CLIENT_ID limit 1; 

    SET @BEGIN_RANGE = 
     (select var_value 
      from counter 
      where var_name = 'latest_report_id_summarized' limit 1); 

    SET @LATEST_INVOICE_ID = 
     (SELECT c.latest_invoice_id 
      from SQL_AuditPro.clients c 
      where c.client_id = CLIENT_ID); 
END 
관련 문제