2012-10-24 3 views
2

테이블및 Name (varchar, unique)으로 구성된 프로세스가 있습니다. 항상 ERROR 1172MySQL 함수 : 열 선택 및 반환

(42000) 결과 (표에 관계없이) 모든 입력과 함께 다음과 같은 기능을 선택

: 결과는 둘 이상의 행

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN myid; 
END$$ 

구성 그러나 아래 함수를 선택하면 항상 NULL이 반환됩니다.

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN myid; 
END$$ 

또한 다음은 올바른 결과를 나타냅니다 (숫자 30과 50은 임의의 숫자입니다).

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    IF myid IS NULL THEN 
    RETURN 30; 
    ELSE 
    RETURN 50; 
    END IF; 
END$$ 

도움이 되었습니까?

UPDATE : 테이블 열과 함수 param 사이의 충돌을 제거하기 위해 편집 됨. 그게 문제라고 나는 생각하지 않는다.

UPDATE2 : 입력 매개 변수가 테이블에 있거나 없을 때 다음과 같이 작동하는 것으로 보입니다. 왜, coalesce()가 없어도 함수는 테이블에있는 입력 매개 변수에 대해서도 NULL을 반환합니까?

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN COALESCE(myid, 0); 
END$$ 
+0

DECLARE myid INT UNSIGNED;

는 열 이름과 동일하며 INT의 differnt 한 종류를 방지하기 때문에 입력 매개 변수의 이름을 변경하려고합니다. 서명 또는 서명을 사용하십시오. –

+0

감사. 입력 매개 변수의 이름을 변경했습니다. 선언 된 var int를 unsigned로 만들었습니다. 변경 없음. – iraxef

+0

@iraxef 쿼리에서 param의 이름을 변경 했습니까? – Parado

답변

0

열 이름은 대소 문자를 구분 MySQL은 그래서 당신은 where Name = name 수단 '나에게 모든 행을 줄'것을 알 수 없습니다.

입력 매개 변수를 프로 시저 (및 쿼리의 해당 조건)를 srchName 또는 name과 다른 것으로 변경하십시오.

0

입력 name의 이름을 inputName과 같은 다른 이름으로 변경하십시오.

업데이트 : 또 다른 제안 ... SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;

+0

아래에는 여전히 ' t 일 : EXISTS DROP 기능 IF LookupOrInsertProcess $$ 펑션 LookupOrInsertProcess 생성 (nametwo VARCHAR (255)) 복귀 UNSIGNED DECLARE에 대한 myid의 INT를 BEGIN UNSIGNED INT; SELECT ID INTO myid FROM 프로세스 이름 Name = nametwo; RETURN myid; END $$ – iraxef

+0

위 업데이트를 확인하십시오. – Alex