2012-09-19 7 views
0

MySQL 데이터베이스를 쿼리하려고합니다. 정수로 데이터베이스에 저장된 필드는 정수로 반환됩니다. 이는 예상했던 것입니다. 저장 프로 시저에서 계산 된 값이있을 때 숫자가 0 또는 1이 될 것이라고 보장 할 수 있더라도 항상 longlong으로 반환됩니다.MySQL의 계산 된 필드의 정수

계산 된 필드의 결과가 여전히 int로 반환됩니다.

흥미롭게도보기에서 계산을 수행 한 다음 해당보기를 쿼리하면 문제를 해결하는 것처럼 보이지만 엄청난 성능 저하가 발생합니다.

편집

나는 것 사용하려고 해요 절차의 종류의 예 : 나는 문제를 단순화하기 위해 시도했습니다 2

DELIMITER // 
    CREATE PROCEDURE getProjectFinance(IN projectID varchar(30)) 
    BEGIN 
      SELECT p.projectID as id, 
       (Select sum(COALESCE(v.Cost, 0)) 
        from variations v 
        where v.projectID = p.projectID) as total 
      FROM Projects p 
      WHERE p.projectID = projectID; 
    END// 
DELIMITER ; 

DELIMITER // 
    CREATE PROCEDURE getAllProjectsFinance() 
    BEGIN 
      SELECT p.projectID as id, 
       (Select sum(COALESCE(v.Cost, 0)) 
        from variations v 
        where v.projectID = p.projectID) as total 
      FROM Projects p 
    END// 
DELIMITER ; 

편집 약간. 다음 SQL 명령은 longlong (8 바이트) 유형의 단일 필드 (count)가있는 레코드를 리턴합니다. 대신 create procedure ...

SELECT cast((Select 1) as signed integer) as count; 
+0

반환 값에 대해 이야기하고 있으므로 저장 프로 시저가 아니라 프로 시저가 아니라고 가정합니다. 상점 함수의 정의를 게시 할 수 있습니까 ('SHOW CREATE FUNCTION function_name' 도움이됩니까?)? 명시 적으로 반환 유형을 정의해야합니다. – lanzz

+0

Updated, 명시 적으로 반환 형식을 정의하는 방법을 잘 모르겠습니다. – ForbesLindesay

답변

0

CREATE FUNCTION name(parameter paramType, ....) RETURNS returnType 당신은 또한 마지막에 복귀 절을 사용한다 : 나는 도움이되지 않는 다음과 같이 캐스팅하여 형의 정수 (4 바이트)

SELECT (Select 1) as count; 

되기를 원한다면 당신의 기능의 몸. 자세한 내용은 the documentation의 공통 기능별 부품을 참조하십시오.

+0

레코드/필드가 여러 개인 경우는 어떻게됩니까? – ForbesLindesay

+0

함수에서 행을 반환하거나 레코드 세트를 반환 할 수 있습니다. 그에 따라 반환 유형을 조정하십시오. – xception

+0

구체적인 예를 들어 줄 수 있습니까? 나는. 필드 중 하나가 계산 된 int 인 테이블에서 몇 개의 레코드를 선택하는 함수를 제공합니까? 감사합니다 – ForbesLindesay

1

방금 ​​계산 된 값을 캐스팅하면 어떻게됩니까?

cast((
    Select sum(COALESCE(v.Cost, 0)) 
    from variations v 
    where v.projectID = p.projectID 
    ) 
    as integer 
) as total 
+0

그것도 작동, 당신은 나에게서 투표 :) – xception

+0

내가 어떻게 부를까요? 방금 projectID로 호출하면 잘못된 매개 변수 번호를 사용하고 있다는 오류가 표시됩니까? – ForbesLindesay

+0

프로 시저에서 둘 이상의 행을 반환하면 프로 시저 대신 함수를 사용해야 할 것입니다. 오류에 대해서는 링크 된 페이지에 표시된대로 출력 매개 변수를 프로 시저에 전달해야합니다. –