솔직히 말해서, 나는 지금 꽤 바보 같은 느낌입니다. 그러나 이것은 단지 이 작동하지 않습니다..MySQL- 저장된 Procs- 출력 매개 변수를 사용할 때의 기이함
시나리오
출력 매개 변수가 포함 된 저장 프로 시저가 있습니다. 그 매개 변수에 값을 SELECT하려고합니다. 이것은 간단하지만, 나에게 잘못된 결과를 계속 제공합니다. 나는 많은 온라인 정보원을 조사해 보았고, 나는 그것을 올바르게하려고 노력하고 있다고 확신한다.
코드
DELIMITER //
CREATE PROCEDURE `spGetId`(
IN ParamA VARCHAR(32),
OUT OutputId INT
)
BEGIN
SELECT `id` INTO OutputId
FROM `Table`
WHERE `column_a` = ParamA;
END//
CALL spGetId('foobar', @Bloop)//
SELECT @Bloop//
결과
나는 자신의 ID는 '1'과 '2'되고,이 테이블의 두 행이있다. SELECT 문이 무엇이든 일치하든 그렇지 않든 상관없이 결과는 '31'입니다. 전적으로 WHERE 절을 제거하고 SELECT를 COUNT (1)을 매개 변수로 반환하는 것을 포함하여 많은 변형을 시도해 봤는데 (이는 2 행이 있음에도 불구하고 '32'의 결과를 제공함) SET @Bloop = 0
을 사용하여 sproke 호출에서 사용하기 전에 @Bloop 변수를 선언하십시오.
왜 이런 일이 발생했는지에 대한 통찰력이 있으며 올바른 가치를 되돌리기 위해 내가 할 수있는 일은 많은 의무가 있습니다. 또한 저장된 값이 인 함수을 사용하여 원하는 결과를 얻는 방법을 보여줄 수 있다면 반환 값을 사용하여 이 더! 내 원하는 접근 방식은 저장 함수를 사용하지만, 그 비슷한 문제가 있었고, 포기하고 저장 프로 시저를 사용하여 시도, 단지 내가 비슷한 결과를 얻고 찾을 수 있습니다.
제공 할 수있는 것이 있으면 도움이 될 것입니다.
편집 : 나는 어떤 인수 와 spGetId()를 호출 할 때
CREATE TABLE `Table` (
`id` int(11) NOT NULL auto_increment,
`column_a` varchar(32) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql> SELECT * FROM Table;
+------+----------+
| id | column_a |
+------+----------+
| 1 | asdf |
| 2 | foobar |
+------+----------+
, 그것은 반환해야 값 인수가 '는 foobar'경우에도 '31'(반환 정수 값은 '2'(또는 ascii 0x32)입니다. '2'를 반환하는 대신 spGetId()를 수정하여 Table의 전체 행 개수를 반환하면 '32'를 반환합니다.
"show create table'Table'"과 "select * from'Table'의 결과를 보여줄 수 있습니까? – Martin
당신이 'spelet'('bleep', @Bloop)'를 호출 한 직후에'show warnings;'호출을 타입 변환 문제처럼 보입니다 – ajreal
최근 편집에서'create table' 테스트를했는데 문제없이 작동합니다 . 올바른 데이터베이스에서이를 테스트하고 있습니까? –