수색…


소개

동적 SQL을 사용하면 런타임에 SQL 쿼리 코드를 어셈블 할 수 있습니다. 이 기술에는 몇 가지 단점이 있으며 매우 신중하게 사용해야합니다. 동시에 복잡한 논리를 구현할 수 있습니다. PL / SQL은 코드에 사용 된 모든 객체가 컴파일 시간에 존재하고 유효해야한다는 것을 요구합니다. 따라서 PL / SQL에서 DDL 문을 직접 실행할 수 없지만 동적 SQL을 사용하면이를 수행 할 수 있습니다.

비고

몇 가지 중요한 발언 :

  1. 문자열 연결을 사용하여 쿼리에 값을 추가하지 말고 매개 변수를 대신 사용하십시오. 이것은 잘못된 것입니다.

    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;
    

    두 번째 이유는 성과입니다. 오라클은 쿼리가 실행될 때마다 매개 변수없이 구문 분석을 수행하며 매개 변수가있는 쿼리는 세션에서 한 번만 구문 분석됩니다.

  2. 데이터베이스 엔진이 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;
/


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow