반응형
테이블에서 이름을 가져 오는 저장 프로 시저 함수를 작성했습니다. 문제는 테이블 이름이 매개 변수로 전달되기를 원한다는 것입니다 (이 함수를 사용해야하는 여러 다른 테이블이 있습니다).
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
반응형
'MySql' 카테고리의 다른 글
MySQL MYSQL Workbench를 사용하여 MYSQL 5.5에서 스키마 이름을 변경할 수 없습니다. (0) | 2021.01.18 |
---|---|
MySQL MYSQL에서 시차를 계산하는 방법 (0) | 2021.01.18 |
MySQL How to round a time to the nearest 15 minute segment (0) | 2021.01.18 |
MySQL에 해당하는 ISDATE () (0) | 2021.01.18 |
MySQL 키 길이없이 키 스펙에 사용되는 BLOB / TEXT 컬럼 '중심' (0) | 2021.01.18 |
댓글