programing

mysql 저장 프로시저의 테이블 이름에 변수 사용

codeshow 2023. 7. 31. 22:01
반응형

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

반응형