MySQL DECLARE의 SELECT INTO 변수로 인해 구문 오류가 발생합니까?


94

단일 값을 변수로 선택하고 싶습니다. 나는 다음을 시도했다 :

DECLARE myvar INT(4);

-즉시 구문 오류를 반환합니다.

SELECT myvalue 
  FROM mytable 
 WHERE anothervalue = 1;

-단일 정수를 반환합니다.

SELECT myvalue 
  INTO myvar 
  FROM mytable 
 WHERE anothervalue = 1;

-작동하지 않음, @myvar 시도

저장 프로 시저 또는 함수 외부에서 DECLARE를 사용할 수 있습니까?

어쩌면 나는 사용자 변수의 개념을 얻지 못할 수도 있습니다 ... 방금 시도했습니다.

SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;

... 예상대로 작동했습니다. 그러나 한 번에 각 쿼리를 실행하면 @var NULL이 표시됩니다.

답변:


109

나는이 같은 문제에 직면했지만 혼란을 일으키는 원인을 알고 있다고 생각합니다. MySql 쿼리 분석기를 사용하는 경우이 작업을 잘 수행 할 수 있습니다.

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

그러나 동일한 쿼리를 MySql Workbench에 넣으면 구문 오류가 발생합니다. 왜 다른지 모르겠지만 그렇습니다. MySql Workbench의 문제를 해결하려면 다음과 같이 쿼리를 다시 작성할 수 있습니다.

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;

6
정말 흥미 롭습니다. 질문에 MySQL 워크 벤치 태그를 추가하여 다른 사람들이이 문제가 MySQL 워크 벤치와 관련이 있음을 알 수 있도록했습니다.
Matt Bannert 2011 년

1
Fedora 18에서 MySQL 워크 벤치 버전 5.2.47 rev 10398을 사용했는데 그런 문제가 없습니다.
GoYun.Info 2013-04-18

41

결국 저장 프로 시저가 내 문제의 해결책이었습니다. 도움이 된 것은 다음과 같습니다.

DELIMITER //
CREATE PROCEDURE test ()
  BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
  SELECT myvar;
  END
  //

DELIMITER ;

call test ();

테스트를위한 Thx ... 흥미롭게 들립니다. 불행히도 나는 마지막 문장을 얻지 못했습니다. 한두 단어 잊으 셨나요?
Matt Bannert 2010

40

이 답변은 여러 변수를 잘 다루지 않습니다.

저장 프로 시저에서 인라인 할당을 수행하면 해당 결과도 결과 집합으로 다시 전송됩니다. 혼란 스러울 수 있습니다. 여러 변수와 함께 SELECT ... INTO 구문을 사용하려면 다음을 수행하십시오.

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

SELECT는 항상 필요한 것은 아니지만 1 행만 반환해야하므로 LIMIT 1을 반환해야합니다.


@가없는 변수도 똑같이하려고 노력했습니다. 감사합니다
Anand Rockzz 2017 년

2
예, 저장 프로 시저에서 변수는 @로 시작할 필요가 없습니다. 그러나 그렇게하는 것이 더 쉽습니다.
Garr Godfrey

21

DECLARE 대신 SET을 사용할 수도 있습니다.

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;

15

MySQL의 문서는 단지 시작에 작품을 선언 a는 BEGIN ... END 블록을 저장 프로그램으로.


'mysql select inside procedure'를 검색하고 여기에 도착한 후 처음에 선언이 없어서 syntax error, missing ;오류 가 발생했습니다 .
Miguel Pynto 2018 년

12

MySQL에서 변수를 선언 할 필요가 없습니다. 변수의 유형은 값이 처음 할당 될 때 자동으로 결정됩니다. 유형은 정수, 10 진수, 부동 소수점, 2 진 또는 2 진이 아닌 문자열 또는 NULL 값 중 하나 일 수 있습니다. 자세한 정보는 사용자 정의 변수 문서를 참조하십시오.

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

SELECT ... INTO를 사용하여 열을 변수에 할당 할 수 있습니다.

http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html

예:

mysql> SELECT 1 INTO @var;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @var;
+------+
| @var |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

1
흠, 어떻게 든 여기에 문제가 있습니다. SELECT 1 INTO @var; 구문 오류도 반환합니다. 그래서 : SELECT somevar INTO @var FROM mytable; DELIMITER 문제일까요?
Matt Bannert 2010-06-19

어떤 오류가 발생합니까? 어떤 버전의 MySQL을 사용하고 있습니까?
마이크

오류 코드 : 1064. SQL 구문에 오류가 있습니다. 3 행의 'INTO @var'근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. Version = 5.5.16
Scott Willeke

4

다음 SELECT INTO과 같은 전역 변수 를 사용할 수 있다는 사실에도 불구하고 주목할 가치가 있습니다 .

SELECT ... INTO @XYZ ...

다음 과 같은 전역 변수를 사용할 수 없습니다FETCH INTO .

FETCH ... INTO @XYZ

버그 가 아닌 것 같습니다 . 누군가에게 도움이 되길 바랍니다 ...


3

Windows Vista에서 버전 6 (Windows 버전 6.0.9 개정 11421 빌드 1170 용 MySQL Workbench Community (GPL))을 사용하고 있습니다. 다음 옵션에는 문제가 없습니다. 아마 그들은 3 년 전에이 사람들이 문제를 겪었 기 때문에 그것을 고쳤을 것입니다.

/* first option */
SELECT ID 
INTO @myvar 
FROM party 
WHERE Type = 'individual';

-- get the result
select @myvar;

/* second option */
SELECT @myvar:=ID
FROM party
WHERE Type = 'individual';


/* third option. The same as SQL Server does */
SELECT @myvar = ID FROM party WHERE Type = 'individual';

위의 모든 옵션이 올바른 결과를 제공합니다.


3

지금 당장 그런 문제를 겪고있는 사람들을 위해, 테이블에 별칭을 넣으십시오. 이것은 트릭이어야합니다. 예 :

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

그것은 나를 위해 일했습니다.

건배.


1

값 앞에 @ 기호를 놓칠 수도 있습니다 select 'test' INTO @myValue.


즉, 세션 변수, 다른 항목의
아담 F

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.