mysql 저장 프로시저의 테이블 이름에 변수 사용
이 저장 프로시저를 사용하여 다른 테이블을 선택하기 위해 mysql 저장 프로시저에 테이블 이름을 전달하려고 하는데 작동하지 않습니다...
이게 제가 시도하고 있는 것입니다.
CREATE PROCEDURE `usp_SelectFromTables`(
IN TableName varchar(100)
)
BEGIN
SELECT * FROM @TableName;
END
@ 기호를 사용하지 않고 시도해 봤는데 테이블 이름이 존재하지 않는다는 것을 알려줍니다.제가 알고 있는 :)
SET @cname:='jello';
SET @vname:='dwb';
SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc');
PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
내게 문제를 일으킨 추가적인 부분.
@kyle이 요청한 대로 쿼리에서 테이블 이름과 필드를 동적으로 설정하고 싶었지만 해당 쿼리의 결과를 변수에 저장하고 싶었습니다.@a
조회 범위 내에서
변수를 넣는 대신@a
에.concat
문자 그대로 문자열 텍스트의 일부로 포함해야 합니다.
delimiter //
CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT)
BEGIN
SET @table_name = table_name;
SET @keyField = keyField;
SET @maxId = maxId;
SET @num_rows = num_rows;
SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name);
PREPARE stmt1 FROM @sql_text1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
loop_label: LOOP
SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1');
PREPARE stmt2 FROM @sql_text2;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;
...Additional looping code...
END LOOP;
END
//
delimiter ;
소인@sql_text1
쿼리 결과를 에 할당합니다.@a
다음을 사용하여 문자열 내:
') INTO @a FROM '
그럼 인@sql_text2
사용하다@a
실제 변수:
,' WHERE ',@keyField,' >= ',
@a의,' ORDER BY '
DBMS에 따라 다르지만 표기법에는 일반적으로 Dynamic SQL이 필요하며 함수의 반환 값이 실행 시 입력에 따라 달라지는 문제가 발생합니다.이것은 시스템 연결을 제공합니다.일반적으로 DBMS는 테이블 이름 또는 열 이름과 같은 쿼리의 구조적 요소에 자리 표시자(매개변수)를 사용할 수 없으며 열 값과 같은 값만 지정할 수 있습니다.
일부 DBMS에는 SQL 문자열을 작성한 다음 '준비' 또는 '즉시 실행' 또는 유사한 작업을 사용하여 작업할 수 있는 저장 프로시저 지원이 있습니다.그러나 갑자기 SQL 주입 공격에 취약해집니다. 그러면 절차를 실행할 수 있는 누군가가 SQL이 실행되는 부분을 제어할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2754423/use-a-variable-for-table-name-in-mysql-sproc
'programing' 카테고리의 다른 글
Android SDK 빌드 도구, 플랫폼 도구 및 도구는 무엇입니까?그리고 어떤 버전을 사용해야 합니까? (0) | 2023.07.31 |
---|---|
CSS로 직사각형 이미지를 사각형으로 만드는 방법은 무엇입니까? (0) | 2023.07.31 |
부트스트랩 사용자 지정 버튼으로 선택하고 즉시 새 값 추가 (0) | 2023.07.31 |
레이아웃이 그려졌을 때 어떻게 알 수 있습니까? (0) | 2023.07.31 |
스타일 변경을 전파하기 위해 WebKit에서 다시 그리거나 다시 칠하도록 강제하려면 어떻게 해야 합니까? (0) | 2023.07.31 |