2013-03-05 5 views
0

상황에 따라 일부 변수가있는 mysql 저장 프로 시저가있어서 루프에 실제로 필요한 변수 목록을 가져 오는 SELECT 기반의 값을 사용하고 싶습니다. (다른 변수에있는 변수의 이름 mysql

DECLARE var1 ; 
DECLARE var2 ; 

SELECT MyVar1,MyVar2 INTO var1,var2 FROM MyValues; 
CURSOR curs FOR 
SELECT varName FROM Mytable WHERE typeId = 1; 

LOOP 
FETCH curs INTO varName; 
    SELECT sqrt(varName.value); //Should be 1 because var1 =1; 
END LOOP; 

내가 세션 변수를 사용하지 않는 한 준비 기능을 불가능 할 것 같다 실제로 내가 동적으로 var1var2가 나타납니다 여기에

MyTable(varId, varName, typeId) 
(0,var1,1) 
(1,var2,2) 

MyValues(MyVar1,MyVar2) 
(1,2) 

는 내가하고 싶은 것입니다 커스에서) 나는 그것을 가져올 수 없다. 세션 변수로 변환합니다.

아무도 내게이 문제를 해결하기위한 아이디어를 줄 수 있습니까? 고마워요!

답변

0

먼저, 왜 변수를 SESSION에 저장 하시겠습니까? 프로 시저 안에 넣을 수 있으면 프로 시저 안에서 사용할 수도 있습니다.

다시 반환해야 할 경우 프로 시저 내에 결과 집합을 반환하고 웹 프로그래밍 또는 응용 프로그램에서이를 가져올 수 있습니다. 마찬가지로 :

SELECT @var1, @var2 

한가지 더, 내가 바로 당신이있어 정말 잘 모르겠지만, 당신은 외부에서 변수를 원하는 경우 (웹 응용 프로그램), 당신은 단지뿐만 아니라 매개 변수로 전달할 수 있습니다. 같은 질문을 편집 한 후

$mysqli->query("CALL procedure_name($parameter1, $parameter2)"); 

는 : 나는 이것을 이해하지 않습니다 ..

CURSOR curs FOR 
SELECT varName FROM Mytable WHERE typeId = 1; 

LOOP 

를 바로 선택하려면 여기 커서를 사용하는 이유는 무엇입니까? 어쨌든 'varName'다음 줄을 사용하고 싶습니다. 당신이 * a_variable * 내부의 값을 사용하여 얻을 여기

DECLARE a_variable VARCHAR(50); 
SELECT varName INTO a_variable FROM Mytable WHERE typeId = 1; 

:

SELECT sqrt(a_variable);//NOT like varName.value 

이 귀하의 질문에 대답 하는가하면 같은 다른 변수에 저장 할 수 있습니까? 저에게 알려주세요.

수정 # 3 : 내가 잘못 여기에 질문을 가지고 :

// 1이 있어야하기 때문에이 var1 = 1;

SET @query = CONCAT('select SQRT(@', var_name, ') as square_root'); 
    -- SELECT @query; 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 

여기에 내가 함께이 시도 전체 절차 : 여기

는 사용하는 데 필요한 코드입니다

DELIMITER $$ 

CREATE PROCEDURE `test_var`(
) 
BEGIN 
    DECLARE var1 int; 
    DECLARE var2 int; 
    DECLARE var_name varchar(50); 

    SELECT MyVar1,MyVar2 INTO @var1,@var2 FROM MyValues; 
    SELECT varName INTO var_name FROM Mytable WHERE typeId = 1; 

    SET @query = CONCAT('select SQRT(@', var_name, ') as square_root'); 
    -- SELECT @query; 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 

END 

희망이 도움이됩니다. 저에게 알려주세요.

감사 Mayukh이

+0

내가 DB 내부 테이블에서 변수 이름을 얻을, 내가 응용 프로그램에서 아무것도 얻을 .. 내가 정말 분명하지 않다 생각 , 답변 주셔서 감사합니다 (그들을 선택 커서). "varName.Value"라고 쓰는 방법은 mysql이 varName의 값을 변수 이름으로 간주하도록하고 싶다는 사실을 표현하기위한 것이었다. 이 경우, 우리는 : 'varName = 'var1'; var1 = 1; 그리고 그리고 처리하고 싶습니다 : ''SELECT sqrt (var1); '에 해당하는''''''''''''''''''''''''''sqrt (1);''이 처리됩니다 : SELECT sqrt (varName);'SELECT sqrt ('var1');'(그것은 의미가 없습니다 ..). – Kruskaal

+0

세션 변수에 대해서는 사용하고 싶지 않습니다. 단지 SP 변수에 액세스 할 수없는 준비된 명령문을 실행하는 것이므로 세션의 변수를 설정해야했습니다. 대신 좋은 버릇이 아니며 마침내 커서로 사용할 수 없습니다. – Kruskaal

+0

안녕하세요 @ 진. 내 대답을 편집했습니다. –

관련 문제