0

솔직히 말해서, 나는 지금 꽤 바보 같은 느낌입니다. 그러나 이것은 단지 이 작동하지 않습니다..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'를 반환합니다.

+0

"show create table'Table'"과 "select * from'Table'의 결과를 보여줄 수 있습니까? – Martin

+0

당신이 'spelet'('bleep', @Bloop)'를 호출 한 직후에'show warnings;'호출을 타입 변환 문제처럼 보입니다 – ajreal

+0

최근 편집에서'create table' 테스트를했는데 문제없이 작동합니다 . 올바른 데이터베이스에서이를 테스트하고 있습니까? –

답변

0

테스트 환경을 변경하는 방법을 배워야합니다.

정확히 정확히 무엇이 문제인지는 모르겠지만 phpMyAdmin이 자체적으로 일종의 유형 변환을 수행하고있는 것처럼 보입니다. 그리고 그 특정 클라이언트를 통해 모든 테스트를 실행하고있었습니다.

내 자신의 빠른 PHP 스크립트를 함께 버리고 sproc (수동 테스트)에서 원하는 결과를 얻을 수 있습니다.

따라서 교훈 : 클라이언트를 신뢰하지 마십시오. 그것을 조금 바꾸는 것을 잊지 마십시오.

1

저장된 proc이 작동 중입니다. 정수 값 1 대신 문자 '1'의 ASCII 값을 반환한다고 생각합니다.

+0

꽤 실행 가능한 것 같습니다. 하지만 ID가 반환해야하는 ID는 '2'이므로 ID가 '1'을 반환하는 이유가 확실하지 않습니다. 열이 int (11)이고 sproc 반환 값이 int (11) 인 경우 왜 ascii 값을 반환할까요? 거기에 다른 것이있을 것이라는 것을 알고 있습니까? – JMTyler

관련 문제