Oracle Database
동적 SQL
수색…
소개
동적 SQL을 사용하면 런타임에 SQL 쿼리 코드를 어셈블 할 수 있습니다. 이 기술에는 몇 가지 단점이 있으며 매우 신중하게 사용해야합니다. 동시에 복잡한 논리를 구현할 수 있습니다. PL / SQL은 코드에 사용 된 모든 객체가 컴파일 시간에 존재하고 유효해야한다는 것을 요구합니다. 따라서 PL / SQL에서 DDL 문을 직접 실행할 수 없지만 동적 SQL을 사용하면이를 수행 할 수 있습니다.
비고
몇 가지 중요한 발언 :
문자열 연결을 사용하여 쿼리에 값을 추가하지 말고 매개 변수를 대신 사용하십시오. 이것은 잘못된 것입니다.
execute immediate 'select value from my_table where id = ' || id_valiable into result_variable;
그리고 이것이 옳다.
execute immediate 'select value from my_table where id = :P ' using id_valiable into result_variable;
이것에는 두 가지 이유가 있습니다. 첫 번째는 보안입니다. 문자열 연결은 SQL 주입을 허용합니다. 아래 쿼리에서 변수에 값
1 or 1 = 1
이 포함되면UPDATE
문은 테이블의 모든 행을 업데이트합니다.execute immediate 'update my_table set value = ''I have bad news for you'' where id = ' || id;
두 번째 이유는 성과입니다. 오라클은 쿼리가 실행될 때마다 매개 변수없이 구문 분석을 수행하며 매개 변수가있는 쿼리는 세션에서 한 번만 구문 분석됩니다.
데이터베이스 엔진이 DDL 문을 실행할 때 암시 적 커밋을 실행합니다.
동적 SQL에서 값 선택
사용자가 다른 테이블에서 데이터를 선택하려고한다고 가정 해 보겠습니다. 테이블은 사용자가 지정합니다.
function get_value(p_table_name varchar2, p_id number) return varchar2 is
value varchar2(100);
begin
execute immediate 'select column_value from ' || p_table_name ||
' where id = :P' into value using p_id;
return value;
end;
평소와 같이이 함수를 호출하십시오.
declare
table_name varchar2(30) := 'my_table';
id number := 1;
begin
dbms_output.put_line(get_value(table_name, id));
end;
테스트 할 테이블 :
create table my_table (id number, column_value varchar2(100));
insert into my_table values (1, 'Hello, world!');
동적 SQL에 값 삽입
아래 예제는 이전 예제의 값을 테이블에 삽입합니다.
declare
query_text varchar2(1000) := 'insert into my_table(id, column_value) values (:P_ID, :P_VAL)';
id number := 2;
value varchar2(100) := 'Bonjour!';
begin
execute immediate query_text using id, value;
end;
/
동적 SQL의 값 업데이트
첫 번째 예제에서 테이블을 업데이트 해 보겠습니다.
declare
query_text varchar2(1000) := 'update my_table set column_value = :P_VAL where id = :P_ID';
id number := 2;
value varchar2(100) := 'Bonjour le monde!';
begin
execute immediate query_text using value, id;
end;
/
DDL 문 실행
이 코드는 테이블을 만듭니다.
begin
execute immediate 'create table my_table (id number, column_value varchar2(100))';
end;
/
익명 블록 실행
익명 블록을 실행할 수 있습니다. 이 예제는 동적 SQL에서 값을 반환하는 방법을 보여줍니다.
declare
query_text varchar2(1000) := 'begin :P_OUT := cos(:P_IN); end;';
in_value number := 0;
out_value number;
begin
execute immediate query_text using out out_value, in in_value;
dbms_output.put_line('Result of anonymous block: ' || to_char(out_value));
end;
/