PL/SQL의 동적 SQL을 사용하면 런타임에 SQL 문을 제작하고 실행할 수 있습니다. 이는 입력 매개 변수 또는 컴파일 시간에 알려지지 않은 기타 런타임 조건을 기반으로 쿼리를 빌드해야 할 때 매우 유용합니다. 주요 메커니즘은 EXECUTE IMMEDIATE
것입니다. 이 명령문은 SQL 문을 포함하는 문자열을 입력으로 취하고 직접 실행합니다.
기본 예는 다음과 같습니다.
<code class="sql">DECLARE v_sql VARCHAR2(200); v_emp_id NUMBER := 100; v_emp_name VARCHAR2(50); BEGIN v_sql := 'SELECT first_name FROM employees WHERE employee_id = ' || v_emp_id; EXECUTE IMMEDIATE v_sql INTO v_emp_name; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name); END; /</code>
이 코드 스 니펫은 v_emp_id
의 값에 따라 SELECT
문을 동적으로 구성합니다. EXECUTE IMMEDIATE
다음이 동적으로 생성 된 쿼리를 실행하고 결과는 v_emp_name
에 저장됩니다. 여러 행을 반환하는 쿼리의 경우 루프 내에서 OPEN FOR
, FETCH
및 CLOSE
있는 커서를 사용합니다. 예를 들어:
<code class="sql">DECLARE v_sql VARCHAR2(200); v_dept_id NUMBER := 10; type emp_rec is record (first_name VARCHAR2(50), last_name VARCHAR2(50)); type emp_tab is table of emp_rec index by binary_integer; emp_data emp_tab; i NUMBER; BEGIN v_sql := 'SELECT first_name, last_name FROM employees WHERE department_id = ' || v_dept_id; OPEN emp_cursor FOR v_sql; LOOP FETCH emp_cursor INTO emp_data(i); EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || emp_data(i).first_name || ' ' || emp_data(i).last_name); i := i 1; END LOOP; CLOSE emp_cursor; END; /</code>
동적으로 생성 된 쿼리로 반환 된 여러 행을 처리하는 방법을 보여줍니다. EXCEPTION
블록을 사용하여 항상 잠재적 예외를 처리해야합니다.
동적 SQL의 가장 큰 보안 위험은 SQL 주입 입니다. 사용자가 공급 한 입력이 적절한 소독없이 SQL 문에 직접 연결되는 경우, 공격자는 악성 코드를 주입하여 잠재적으로 액세스 할 수없는 데이터를 읽거나 수정하거나 삭제할 수 있습니다.
완화 전략 :
EXECUTE IMMEDIATE
문은 약간 다른 구문을 사용하여 바인드 변수를 지원합니다.<code class="sql">DECLARE v_emp_id NUMBER := :emp_id; -- Bind variable v_emp_name VARCHAR2(50); BEGIN EXECUTE IMMEDIATE 'SELECT first_name FROM employees WHERE employee_id = :emp_id' INTO v_emp_name USING v_emp_id; -- Binding the value DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name); END; /</code>
동적 SQL의 성능은 몇 가지 요인에 의해 영향을받을 수 있습니다. 최적화하는 방법은 다음과 같습니다.
INTO
대신에 EXECUTE IMMEDIATE
실행하십시오. 커서는 오버 헤드를 소개합니다.위의 요점을 결합하여 모범 사례 요약은 다음과 같습니다.
위 내용은 PL/SQL에서 동적 SQL을 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!