본문 바로가기
MySql

MySQL 저장 프로 시저 함수의 동적 테이블 이름

by 베이스 공부 2021. 1. 18.
반응형

테이블에서 이름을 가져 오는 저장 프로 시저 함수를 작성했습니다. 문제는 테이블 이름이 매개 변수로 전달되기를 원한다는 것입니다 (이 함수를 사용해야하는 여러 다른 테이블이 있습니다).

DELIMITER $$

CREATE DEFINER=`root`@`localhost` FUNCTION `getName`(tableName VARCHAR(50), myId INT(11)) RETURNS VARCHAR(50)

  begin

  DECLARE myName VARCHAR(50);

  SELECT
    'name' INTO myName
  FROM
    tableName
  WHERE 
    id=myId;

  RETURN myName;

  end

이 메서드는 변수의 실제 값 대신 변수 이름 "tableName"을 사용하기 때문에 오류가 있습니다.

다음과 같이 CONCAT 를 사용하여 절차 에서이 문제를 해결할 수 있습니다.

    SET @GetName = CONCAT("
    SELECT
       'name'
    FROM
        ",tableName,"
    WHERE 
        id=",myId,";
    ");

    PREPARE stmt FROM @GetName;
    EXECUTE stmt;

...하지만 함수에서이 작업을 수행하려고하면 다음과 같은 메시지가 표시됩니다.

저장된 함수 또는 트리거에서 동적 SQL이 허용되지 않습니다.

대신 프로 시저 를 사용하려고했지만 함수처럼 값을 반환 할 수 없었습니다.

따라서 누구나이 문제를 해결할 수있는 방법을 볼 수 있습니다. 정말 믿을 수 없을 정도로 기본적인 것 같습니다.

 

해결 방법

 

식별자를 사용하여 SQL 문을 확장하려면 준비된 문을 사용해야합니다. 그러나 준비된 명령문은 함수에서 사용할 수 없습니다. 따라서 OUT 매개 변수를 사용하여 저장 프로 시저를 만들 수 있습니다.

CREATE PROCEDURE getName
 (IN tableName VARCHAR(50), IN myId INT(11), OUT myName VARCHAR(50))
BEGIN

  SET @GetName =
    CONCAT('SELECT name INTO @var1 FROM ', tableName, ' WHERE id=', myId);
  PREPARE stmt FROM @GetName;
  EXECUTE stmt;

  SET myName = @var1;
END

사용 예-

SET @tableName = 'tbl';
SET @myId = 1005;
SET @name = NULL;
CALL getName(@tableName, @myId, @name);
SELECT @name;

 

참조 페이지 https://stackoverflow.com/questions/13705045

 

 

반응형

댓글