Prepared Statements CSED421: Database Systems Labs
SQL states have static and variable parts SELECT * FROM JokeBoard WHERE title LIKE '%공대생%'; SELECT * FROM Animal WHERE age > 5; 고정된 부분을 재활용할 수 있도록 미리 저장해두고 필요한 값만 바꿔서 사용(caching query parsing)
Prepare and execute statements PREPARE <stmt_name> FROM <preparable_stmt>; SET @<var_name> = <value>; EXECUTE <stmt_name> USING @<var_name>[, @<var_name>, …];
> PREPARE stmt1 FROM 'SELECT SQRT(POW(. ,2) + POW( > PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; > SET @a = 3; > SET @b = 4; > EXECUTE stmt1 USING @a, @b; result: hypotenuse = 5 > SET @a = 5; > SET @b = 12; > EXECUTE stmt1 USING @a, @b; result: hypotenuse = 13 > SET @a = 580; > SET @b = 741; > EXECUTE stmt1 USING @a, @b; result: hypotenuse = 941
Deallocate prepare statements DEALLOCATE PREPARE <stmt_name>; DROP PREPARE <stmt_name>; 또는 같은 이름으로 PREPARE 할 경우 기존 것은 없어짐 DEALLOCATE PREPARE stmt1;
SQL Injection
SQL Injection Article[] SearchJokeBoard(String keyword) { String query = "SELECT * FROM JokeBoard WHERE title LIKE '%" + keyword + "%';"; DBMS.run(query); … } What happen if keyword is "x'; DROP TABLE Users; -- "; SELECT * FROM JokeBoard WHERE title LIKE '%x'; DROP TABLE Users; -- %'; If you use the prepared statement, SELECT * FROM JokeBoard WHERE title LIKE '%x\'; DROP TABLE Users; -- %'; So, use prepare statement to prevent some SQL Injections.
Practice 1. EMP 테이블에서 이름에 ‘R’이 포함되는 사람의 이름을 출력 2. EMP 테이블에서 이름을 검색할 수 있는 statement를 작성하고 ‘R’이 포함되는 사람의 이름을 출력 3. EMP 테이블에서 SAL과 COMM의 합이 특정 값 이상인 사람의 이름을 출력하는 statement를 작성하고 1000 이상, 2000 이상, 3000 이상을 각각 출력