2009-07-16 2 views
5

이것은 MySQL 5.1입니다.MySQL : 프로 시저 매개 변수를 EXECUTE USING 문으로 전달

(참고 :이 내 진짜 코드가 아닙니다 내가이 특정 예를하는 더 나은 방법이 실현) : 나는 그것을 호출 할 때 아래의 절차가 생성됩니다,하지만

여기

는 내가하고 싶은 것입니다 나는 "ERROR 1210 (HY000) : 잘못된 인수를 실행하기 위해"수

DELIMITER // 
CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @mystate = state; 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "?"'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @mystate; 
END; 
// 

CALL get_users_by_state('AA')// 
ERROR 1210 (HY000): Incorrect arguments to EXECUTE 

대한 EXECUTE 사용 문에 프로 시저의 매개 변수를 전달하는 방법이 있나요? 여기 실제로 작업을 수행하는 버전입니다, 그러나 저 irks : 사이드 질문으로

CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "', state, '"') 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
END; 
// 

를, MySQL은) (포스트 그레스 '을 quote_literal()와에서 quote_ident와 같은 문자열을 탈출을 위해 어떤 시설이 있습니까?

참조 점에 대한

, 여기에 포스트 그레스 다소 상응하는 무언가가있다 :

CREATE OR REPLACE FUNCTION get_info_by_state(character) 
    RETURNS SETOF ret_type AS 
$BODY$ 
DECLARE 
    sql text; 
BEGIN 
    sql := 'SELECT uid, some_data FROM test_table WHERE state = ' || quote_literal($1); 
    RETURN QUERY EXECUTE sql; 
END 
$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE 

감사합니다!

답변

2

매개 변수 홀더 주위에 큰 따옴표가 필요하지 않다고 생각합니다. 나는이 할 경우

DELIMITER // 
CREATE PROCEDURE get_users_by_state(IN state CHAR(2)) 
READS SQL DATA 
BEGIN 
SET @mystate = state; 
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = ?'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @mystate; 
END; 
// 
+0

: 오해가 없을 않도록

여기에 업데이트, SET @Sql = CONCAT를 ('test_table SELECT * FROM을 WHERE 상태 ='상태); 는 그 다음 컴파일,하지만 난 그것을 호출 할 때, 내가 얻을 : MySQL의> 통화 get_users_by_state ('AA')가 // ERROR 1054 (42S22) : '절 곳' 그래서이 알 수없는 열 'AA'는 서라운드 그것은 어떤 수준에서 따옴표로 보입니다, 그것은 –

+0

입니다. 나는 매개 변수 홀더가있는 버전을 의미했지만 연결은 아닙니다. 'SET @sql = 'SELECT * FROM test_table WHERE state =?'; ' – ChssPly76

+1

아, 알겠습니다. 나는 그것을 테스트 할 것이지만, 내가 그 예제를 작동시킬 수 있다면, 내 질문에 대한 답을 얻을 것이다. ( –

관련 문제