동적 SQL은 런타임에 동적으로 SQL 문을 작성할 수있는 프로그래밍 기술입니다. 컴파일시 SQL 문의 전체 텍스트를 알 수 없기 때문에 동적 SQL을 사용하여보다 일반적인 용도의 유연한 응용 프로그램을 만들 수 있습니다. 예를 들어 동적 SQL을 사용하면 런타임까지 이름이 알려지지 않은 테이블에서 작동하는 프로 시저를 생성 할 수 있습니다.
과거 Oracle 릴리스에서 PL / SQL 애플리케이션에서 동적 SQL을 구현하는 유일한 방법은 다음과 같습니다. DBMS_SQL
패키지를 사용합니다. Oracle8i는 DBMS_SQL
패키지의 대안 인 네이티브 동적 SQL을 도입했습니다. 원시 동적 SQL을 사용하여 동적 SQL 문을 PL / SQL 블록에 직접 배치 할 수 있습니다.
이 장에서는 다음 항목을 다룹니다.
- 동적 SQL이란?
- 동적 SQL을 사용하는 경우
- 네이티브 동적 SQL을 사용하는 동적 SQL 시나리오
- 네이티브 동적 SQL과 DBMS_SQL 패키지
- 애플리케이션 PL / SQL 이외의 개발 언어
동적 SQL이란?
동적 SQL을 사용하면 런타임까지 전체 텍스트를 알 수없는 SQL 문을 참조하는 프로그램을 작성할 수 있습니다. 동적 SQL을 자세히 논의하기 전에 정적 SQL에 대한 명확한 정의가 동적 SQL을 이해하는 데 좋은 출발점이 될 수 있습니다. 정적 SQL 문은 실행마다 변경되지 않습니다. 정적 SQL 문의 전체 텍스트는 컴파일시 알려지며 다음과 같은 이점을 제공합니다.
- 성공적인 컴파일은 SQL 문이 유효한 데이터베이스 개체를 참조하는지 확인합니다.
- 성공적인 컴파일은 데이터베이스 개체에 액세스하는 데 필요한 권한이 있는지 확인합니다.
- 정적 SQL의 성능은 일반적으로 동적 SQL보다 우수합니다.
이러한 장점 때문에 정적 SQL을 사용하여 목표를 달성 할 수 없거나 정적 SQL을 사용하는 것이 동적 SQL에 비해 번거로운 경우에만 동적 SQL을 사용해야합니다. 그러나 정적 SQL에는 동적 SQL로 극복 할 수있는 한계가 있습니다. PL / SQL 프로 시저에서 실행해야하는 SQL 문의 전체 텍스트를 항상 알 수있는 것은 아닙니다. 프로그램은 실행할 SQL 문을 정의하는 사용자 입력을 승인하거나 프로그램이 올바른 조치 과정을 판별하기 위해 일부 처리 작업을 완료해야 할 수 있습니다. 이러한 경우 동적 SQL을 사용해야합니다.
예를 들어 런타임까지 정확한 테이블 이름을 알 수없는 데이터웨어 하우스 환경의 테이블에 대해 표준 쿼리를 수행하는보고 응용 프로그램을 생각해보십시오. 데이터웨어 하우스에 많은 양의 데이터를 효율적으로 수용하기 위해 분기마다 송장 정보를 저장하는 새 테이블을 만듭니다. 이러한 테이블은 모두 정확히 동일한 정의를 가지며 분기의 시작 월과 연도에 따라 이름이 지정됩니다 (예 : INV_01_1997
, INV_04_1997
, INV_07_1997
, INV_10_1997
, INV_01_1998
등.이 경우 동적 보고 애플리케이션에서 SQL을 사용하여 런타임에 테이블 이름을 지정합니다.
정적 SQL을 사용하면 프로그램의 SQL 문에서 참조하는 테이블 정의와 같은 모든 데이터 정의 정보를 컴파일 할 때 알아야합니다. 데이터 정의가 변경되면 프로그램을 변경하고 다시 컴파일해야합니다. 동적 SQL 프로그램은 SQL 문이 런타임에 “즉시”변경 될 수 있으므로 데이터 정의 정보의 변경을 처리 할 수 있습니다. 따라서 동적 SQL은 정적 SQL보다 훨씬 더 유연합니다. 동적 SQL을 사용하면 코드가 사용 된 특정 SQL 문과 독립적 인 프로세스를 정의하므로 재사용 가능한 응용 프로그램 코드를 작성할 수 있습니다.
또한 동적 SQL을 사용하면 정적에서 지원되지 않는 SQL 문을 실행할 수 있습니다. 데이터 정의 언어 (DDL) 문과 같은 SQL 프로그램 이러한 명령문을 지원하면 PL / SQL 프로그램으로 더 많은 작업을 수행 할 수 있습니다.
동적 SQL 프로그램이라는 문구는 동적 SQL을 포함하는 프로그램을 의미합니다. 이러한 프로그램에는 정적 SQL도 포함될 수 있습니다. 정적 SQL 프로그램은 정적 SQL 만 포함하고 동적 SQL은 포함하지 않는 프로그램입니다.
동적 SQL을 사용하는 경우
정적 SQL이 다음을 지원하지 않는 경우 동적 SQL을 사용해야합니다. 수행하려는 작업 또는 PL / SQL 프로 시저에 의해 실행되어야하는 정확한 SQL 문을 모르는 경우. 이러한 SQL 문은 사용자 입력에 따라 달라 지거나 프로그램에서 수행 한 작업 처리에 따라 달라질 수 있습니다. 다음 섹션에서는 동적 SQL을 사용해야하는 일반적인 상황과 동적 SQL을 사용하여 해결할 수있는 일반적인 문제를 설명합니다.
동적 DML 문을 실행하려면
동적 SQL을 사용하여 실행할 수 있습니다. 런타임까지 정확한 SQL 문을 알 수없는 DML 문입니다.예는 “DBMS_SQL 패키지 코드 및 기본 동적 SQL 코드의 예”및 “샘플 DML 작업”의 DML 예를 참조하십시오.
PL / SQL에서 정적 SQL이 지원하지 않는 명령문을 실행하려면
PL / SQL에서는 정적 SQL을 사용하여 다음 유형의 문을 실행할 수 없습니다.
- 데이터 정의 언어 (DDL) 문 (예 :
CREATE
,DROP
,GRANT
및REVOKE
-
ALTER
SESSION
및SET
참조 :DDL 및 SCL 문에 대한 정보는 Oracle8i SQL 참조.
PL / 내에서 이러한 유형의 명령문을 실행해야하는 경우 동적 SQL을 사용하십시오. SQL 블록.
또한 PL / SQL의 정적 SQL은 SELECT
TABLE 절의 사용을 허용하지 않습니다. / div> 문. 동적 SQL에는 이러한 제한이 없습니다. 예를 들어 다음 PL / SQL 블록에는 TABLE
절과 기본 동적 SQL을 사용하는 SELECT
문이 포함되어 있습니다.
동적 쿼리 실행
동적 SQL을 사용하여 런타임까지 전체 텍스트를 알 수없는 쿼리 인 동적 쿼리를 실행하는 응용 프로그램을 만들 수 있습니다. 다음과 같은 많은 유형의 애플리케이션이 동적 쿼리를 사용해야합니다.
- 사용자가 입력하거나 런타임에 쿼리 검색 또는 정렬 기준을 선택할 수있는 애플리케이션
- 사용자가 입력 할 수있는 애플리케이션 또는 런타임시 최적화 힌트 선택
- 테이블의 데이터 정의가 지속적으로 변경되는 데이터베이스를 쿼리하는 애플리케이션
- 새 테이블이 자주 생성되는 데이터베이스를 쿼리하는 애플리케이션
예제는 “쿼리 예”를 참조하고 “네이티브 동적 SQL을 사용하는 동적 SQL 시나리오”의 쿼리 예를 참조하십시오.
컴파일시 존재하지 않는 데이터베이스 개체 참조
많은 유형의 애플리케이션이 주기적으로 생성되는 데이터와 상호 작용해야합니다. 예를 들어, 새 테이블이 주기적으로 생성되기 때문에 컴파일시 데이터베이스 테이블의 정의를 확인할 수 있지만 테이블 이름은 확인할 수 없습니다. 애플리케이션이 데이터에 액세스해야하지만 런타임까지 테이블의 정확한 이름을 알 수있는 방법이 없습니다.
동적 SQL을 사용하면 런타임까지 기다릴 수 있기 때문에 동적 SQL이이 문제를 해결할 수 있습니다. 액세스해야하는 테이블 이름. 예를 들어, “동적 SQL이란?”에서 설명한 샘플 데이터웨어 하우스 애플리케이션에서 분기마다 새 테이블이 생성되며 이러한 테이블은 항상 동일한 정의를 갖습니다. 이 경우 사용자가 다음과 유사한 동적 SQL 쿼리를 사용하여 런타임시 테이블 이름을 지정하도록 허용 할 수 있습니다.
동적으로 실행 최적화
정적을 사용하는 경우 SQL의 경우 컴파일시 SQL 문을 구성하는 방법, 문에 힌트를 포함할지 여부, 힌트를 포함하는 경우 정확히 어떤 힌트를 포함할지 결정해야합니다. 그러나 동적 SQL을 사용하여 실행을 최적화하고 힌트를 SQL 문에 동적으로 연결하는 방식으로 SQL 문을 작성할 수 있습니다. 이렇게하면 재 컴파일하지 않고도 현재 데이터베이스 통계를 기반으로 힌트를 변경할 수 있습니다.
예를 들어 다음 절차에서는 a_hint
라는 변수를 사용하여 사용자를 허용합니다. SELECT
문에 힌트 옵션을 전달하려면 :
이 예에서 사용자는 a_hint
:
동적 PL / SQL 블록을 호출하려면
EXECUTE
IMMEDIATE
문을 사용하여 익명의 PL / SQL 블록을 호출합니다. 동적 PL / SQL 블록을 호출하는 기능은 실행할 모듈이 런타임에 동적으로 결정되는 애플리케이션 확장 및 사용자 정의에 유용 할 수 있습니다.
예를 들어 이벤트를받는 애플리케이션을 작성한다고 가정 해 보겠습니다. 번호를 지정하고 이벤트 핸들러로 전달합니다. 핸들러의 이름은 EVENT_HANDLER_
event_num 형식입니다. 여기서 event_num은 이벤트 번호입니다. 한 가지 접근 방식은 아래에 표시된 것처럼 디스패처를 switch 문으로 구현하는 것입니다. 여기에서 코드는 적절한 핸들러에 대한 정적 호출을 수행하여 각 이벤트를 처리합니다.
이 코드는 디스패처 코드가 있기 때문에 그다지 확장 할 수 없습니다. 새 이벤트에 대한 처리기가 추가 될 때마다 업데이트되어야합니다. 그러나 네이티브 동적 SQL을 사용하면 다음과 유사한 확장 가능한 이벤트 디스패처를 작성할 수 있습니다.
Invoker-Rights를 사용하여 동적 작업을 수행하려면
동적과 함께 invoker-rights 기능을 사용하여 SQL을 사용하면 호출자의 권한 및 스키마에 따라 동적 SQL 문을 실행하는 응용 프로그램을 빌드 할 수 있습니다.이 두 가지 기능인 호출자 권한 및 동적 SQL을 사용하면 호출자의 데이터 및 모듈에서 작동하고 액세스 할 수있는 재사용 가능한 애플리케이션 하위 구성 요소를 구축 할 수 있습니다.
PL / 호출자 권한 및 원시 동적 SQL 사용에 대한 정보는 SQL 사용자 안내서 및 참조 서를 참조하십시오.
네이티브 동적 SQL을 사용하는 동적 SQL 시나리오
이 섹션에서 설명하는 시나리오는 성능과 유연성을 보여줍니다. 네이티브 동적 SQL의. 이 시나리오에는 네이티브 동적 SQL을 사용하여 다음 작업을 수행하는 방법을 보여주는 예제가 포함되어 있습니다.
- DDL 및 DML 작업 실행
- 단일 행 및 여러 행 쿼리 실행
데이터 모델
이 시나리오의 데이터베이스는 다음 데이터 모델을 사용하는 회사의 인적 자원 데이터베이스 (이름 : hr
)입니다. :
offices
라는 마스터 테이블에는 모든 회사 위치 목록이 포함됩니다. offices
테이블에는 다음과 같은 정의가 있습니다. :
Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)
여러 emp_
위치 테이블에는 직원 정보가 포함됩니다. 여기서 location은 사무실이있는 도시의 이름입니다. 예를 들어, emp_houston
라는 테이블에는 회사 휴스턴 사무실에 대한 직원 정보가 포함되어 있고 emp_boston
라는 테이블에는 직원이 포함되어 있습니다. 회사의 보스턴 지사 정보.
각 emp_
위치 테이블의 정의는 다음과 같습니다.
다음 섹션에서는 hr
의 데이터에 대해 수행 할 수있는 다양한 기본 동적 SQL 작업을 설명합니다. 데이터베이스.
샘플 DML 작업
다음 기본 동적 SQL 절차는 특정 직책을 가진 모든 직원에게 인상을줍니다.
샘플 DDL 작업
EXECUTE IMMEDIATE
문은 DDL 작업을 수행 할 수 있습니다. 예를 들어 다음 절차는 사무실 위치를 추가합니다.
다음 절차는 사무실 위치를 삭제합니다.
샘플 동적 단일 행 쿼리
EXECUTE
IMMEDIATE
문은 동적 단일 행 쿼리를 수행 할 수 있습니다. USING
절에 바인드 변수를 지정하고 결과 행을 문의 INTO
절에 지정된 대상으로 가져올 수 있습니다.
다음 함수는 특정 위치에서 지정된 작업을 수행하는 직원 수를 검색합니다.
샘플 동적 다중 행 쿼리
OPEN-FOR
, FETCH
및 CLOSE
문은 동적 다중 행 쿼리를 수행 할 수 있습니다. 예를 들어, 다음 절차는 지정된 위치에서 특정 작업을 수행하는 모든 직원을 나열합니다.
네이티브 동적 SQL과 DBMS_SQL 패키지
Oracle은 동적 SQL을 사용하는 두 가지 방법을 제공합니다. PL / SQL 내 : 네이티브 동적 SQL 및 DBMS_SQL
패키지. 네이티브 동적 SQL을 사용하면 동적 SQL 문을 PL / SQL 코드에 직접 배치 할 수 있습니다. 이러한 동적 문에는 DML 문 (쿼리 포함), PL / SQL 익명 블록, DDL 문, 트랜잭션 제어 문 및 세션 제어 문이 포함됩니다.
대부분의 기본 동적 SQL 문을 처리하려면
IMMEDIATE
문. 그러나 다중 행 쿼리 (SELECT
문)를 처리하려면OPEN-FOR
,FETCH
및CLOSE
문
네이티브 동적 SQL을 사용하려면 COMPATIBLE
초기화 매개 변수는 8.1.0 이상으로 설정되어야합니다. COMPATIBLE
매개 변수에 대한 자세한 내용은 Oracle8i 마이그레이션을 참조하십시오.
DBMS_SQL
패키지는 다음을위한 프로그래밍 API를 제공하는 PL / SQL 라이브러리입니다. SQL 문을 동적으로 실행합니다. DBMS_SQL
패키지에는 커서 열기, 커서 구문 분석, 바인드 제공 등을위한 프로그래밍 인터페이스가 있습니다. DBMS_SQL
패키지를 사용하는 프로그램은 호출합니다. 이 패키지에 추가하여 동적 SQL 작업을 수행합니다.
다음 섹션에서는 두 방법의 장점에 대한 자세한 정보를 제공합니다.
기본 동적 SQL 사용에 대한 자세한 내용은 PL / SQL User “s Guide and Reference를, DBMS_SQL
패키지. PL / SQL 사용 설명서 및 참조에서 네이티브 동적 SQL은 단순히 동적 SQL이라고합니다.
네이티브 동적 SQL의 장점
네이티브 동적 SQL은 패키지 :
사용 편의성
네이티브 동적 SQL은 DBMS_SQL
패키지보다 사용이 훨씬 간단합니다.원시 동적 SQL은 SQL과 통합되므로 현재 PL / SQL 코드 내에서 정적 SQL을 사용하는 것과 동일한 방식으로 사용할 수 있습니다. 또한 기본 동적 SQL 코드는 일반적으로 DBMS_SQL
패키지를 사용하는 동등한 코드보다 간결하고 읽기 쉽습니다.
DBMS_SQL
패키지는 기본 동적 SQL만큼 사용하기 쉽지 않습니다. 엄격한 순서로 사용해야하는 많은 절차와 기능이 있습니다. 일반적으로 간단한 작업을 수행하려면 DBMS_SQL
패키지를 사용할 때 많은 양의 코드가 필요합니다. 대신 네이티브 동적 SQL을 사용하여 이러한 복잡성을 피할 수 있습니다.
표 8-1은 DBMS_SQL
패키지 및 기본 동적 SQL.
표 8-1 DBMS_SQL 패키지 및 기본 동적 SQL의 코드 비교
성능 향상
PL / SQL에서 네이티브 동적 SQL의 성능은 정적 SQL의 성능과 비슷합니다. PL / SQL 인터프리터에는 네이티브 동적 SQL에 대한 지원이 내장되어 있기 때문입니다. 따라서 네이티브 동적 SQL을 사용하는 프로그램의 성능은 DBMS_SQL
패키지를 사용하는 프로그램의 성능보다 훨씬 좋습니다. 일반적으로 네이티브 동적 SQL 문은 DBMS_SQL
패키지를 사용하는 해당 문보다 1.5 ~ 3 배 더 나은 성능을 제공합니다. 물론 성능 향상은 응용 프로그램에 따라 다를 수 있습니다.
DBMS_SQL
패키지는 절차 적 API를 기반으로하므로 높은 절차 호출 및 데이터 복사 오버 헤드가 발생합니다. 예를 들어, 변수를 바인딩 할 때마다 DBMS_SQL
패키지는 나중에 실행 중에 사용할 수 있도록 PL / SQL 바인딩 변수를 해당 공간에 복사합니다. 마찬가지로, 가져 오기를 실행할 때마다 먼저 데이터가 DBMS_SQL
패키지에서 관리하는 공간에 복사 된 다음 가져온 데이터가 한 번에 한 열씩 적절한 위치에 복사됩니다. PL / SQL 변수로 인해 데이터 복사로 인한 상당한 오버 헤드가 발생합니다. 대조적으로, 원시 동적 SQL은 명령문 준비, 바인딩 및 실행 단계를 단일 작업으로 묶어 데이터 복사 및 프로 시저 호출 오버 헤드를 최소화하고 성능을 향상시킵니다.
성능 팁
네이티브 동적 SQL 또는 DBMS_SQL
패키지를 사용하는 경우 바인드 변수를 사용하면 Oracle이 여러 SQL 문에 대해 단일 커서를 공유 할 수 있으므로 바인드 변수를 사용하여 성능을 향상시킬 수 있습니다.
예를 들어 다음 기본 동적 SQL 코드는 바인드 변수를 사용하지 않습니다.
각 고유 한 my_deptno
변수에 대해 새 커서가 생성됩니다. 리소스 경합 및 성능 저하를 유발할 수 있습니다. 대신 다음 예제에서와 같이 my_deptno
를 바인드 변수로 바인드하십시오.
여기에서는 바인드 my_deptno
는 성능과 확장 성을 향상시킵니다.
사용자 정의 유형 지원
기본 동적 SQL은 PL /의 정적 SQL에서 지원하는 모든 유형을 지원합니다. SQL. 따라서 네이티브 동적 SQL은 사용자 정의 개체, 컬렉션 및 REFs
와 같은 사용자 정의 유형에 대한 지원을 제공합니다. DBMS_SQL
패키지는 이러한 사용자 정의 유형을 지원하지 않습니다.
DBMS_SQL
패키지는 배열에 대한 제한된 지원을 제공합니다. 자세한 내용은 Oracle8i Supplied PL / SQL Packages Reference를 참조하십시오.
레코드로 가져 오기 지원
네이티브 동적 SQL 및 정적 SQL 모두 레코드로 가져 오기를 지원하지만 DBMS_SQL
패키지는 그렇지 않습니다. 네이티브 동적 SQL을 사용하면 쿼리의 결과 행을 PL / SQL 레코드로 직접 가져올 수 있습니다.
다음 예에서는 쿼리의 행을 emp_rec
레코드 :
DBMS_SQL 패키지의 장점
DBMS_SQL
패키지는 기본 동적 SQL에 비해 다음과 같은 장점을 제공합니다.
클라이언트 측 프로그램 지원
현재 DBMS_SQL
패키지는 클라이언트 측 프로그램에서 지원되지만 네이티브 동적 SQL은 지원되지 않습니다. 클라이언트 측 프로그램에서 DBMS_SQL
패키지에 대한 모든 호출은 PL / SQL 원격 프로 시저 호출 (RPC)로 변환됩니다. 이러한 호출은 변수를 바인드하거나 변수를 정의하거나 명령문을 실행해야 할 때 발생합니다.
DESCRIBE 지원
DBMS_SQL
패키지의 DESCRIBE_COLUMNS
절차를 사용하여 DBMS_SQL
를 통해 열리고 구문 분석 된 커서의 열을 설명합니다. 이 기능은 SQL * Plus의 DESCRIBE
명령과 유사합니다. 네이티브 동적 SQL에는 DESCRIBE
기능이 없습니다.
대량 동적 SQL 지원
대량 SQL은 단일 DML 문에서 여러 행의 데이터를 처리하는 기능입니다. 대량 SQL은 SQL과 호스트 언어 간의 컨텍스트 전환 양을 줄여 성능을 향상시킵니다. 현재 DBMS_SQL
패키지는 대량 동적 SQL을 지원합니다.
기본 동적 SQL에서 대량 작업을 직접 지원하지는 않지만 기본 동적 대량 SQL을 시뮬레이션 할 수 있습니다. 대량 SQL 문을 “BEGIN
… END
“블록에 배치하고 블록을 동적으로 실행하여 문을 열 수 있습니다. 이 해결 방법을 사용하면 원시 동적 SQL 프로그램 내에서 대량 SQL의 이점을 실현할 수 있습니다. 예를 들어 다음 기본 동적 SQL 코드는 한 테이블의 ename
열을 다른 테이블로 복사합니다.
RETURNING 절을 사용하여 여러 행 업데이트 및 삭제
DBMS_SQL
패키지는 여러 행을 업데이트하거나 삭제하는 RETURNING
절이있는 문을 지원합니다. 원시 동적 SQL은 단일 행이 반환되는 경우 RETURNING
절만 지원합니다.
“DML 반환 예제”의 예는 DBMS_SQL
패키지 코드 및 RETURNING
절을 사용하는 네이티브 동적 SQL 코드.
32KB보다 큰 SQL 문 지원
DBMS_SQL
패키지는 32KB보다 큰 SQL 문을 지원합니다. 네이티브 동적 SQL은 그렇지 않습니다.
SQL 문 재사용
DBMS_SQL
의 PARSE
절차 div> 패키지는 SQL 문을 한 번 구문 분석합니다. 초기 구문 분석 후 다른 바인드 인수 세트를 사용하여 명령문을 여러 번 사용할 수 있습니다.
반대로 네이티브 동적 SQL은 문이 사용될 때마다 실행할 SQL 문을 준비합니다. 명령문 준비에는 일반적으로 구문 분석, 최적화 및 계획 생성이 포함됩니다. 사용할 때마다 명령문을 준비하면 약간의 성능 저하가 발생합니다. 그러나 Oracle의 공유 커서 메커니즘은 비용을 최소화하고 기본 동적 SQL의 성능 이점과 비교할 때 일반적으로 성능 불이익은 사소합니다.
DBMS_SQL 패키지 코드 및 기본 동적 SQL 코드의 예
다음 예는 DBMS_SQL
패키지 및 네이티브 동적 SQL을 사용하여 작업을 완료하는 데 필요한 코드의 차이점을 보여줍니다. 특히 다음 유형의 예가 제공됩니다.
- 쿼리
- DML 작업
- DML 반환 작업
일반적으로 기본 동적 SQL 코드는 다음과 같습니다. 더 읽기 쉽고 간결하여 개발자 생산성을 향상시킬 수 있습니다.
쿼리 예제
다음 예제에는 바인딩 변수가 하나 인 동적 쿼리 문이 포함되어 있습니다 (:jobname
) 및 두 개의 선택 열 (ename
및 sal
) :
stmt_str := "SELECT ename, sal FROM emp WHERE job = :jobname";
이 예제는 j가있는 직원을 쿼리합니다. emp
테이블의 job
열에있는 ob 설명 SALESMAN
표 8-2는 DBMS_SQL
패키지와 네이티브 동적 SQL을 사용하여이 쿼리를 수행하는 샘플 코드를 보여줍니다.
표 8-2 DBMS_SQL 패키지 및 네이티브 동적 SQL을 사용한 쿼리
DML 예제
다음 예에는 열이 3 개인 테이블에 대한 동적 INSERT
문이 포함되어 있습니다.
stmt_str := "INSERT INTO dept_new VALUES (:deptno, :dname, :loc)";
이 예에서는 새 행을 삽입합니다. 열 값이 PL / SQL 변수 deptnumber
, deptname
및 location
. 표 8-3은 DBMS_SQL
패키지 및 기본 동적 SQL을 사용하여이 DML 작업을 수행하는 샘플 코드를 보여줍니다.
표 8-3 DBMS_SQL 패키지를 사용한 DML 작업 및 기본 동적 SQL
DML 반환 예
다음 예에는 동적 UPDATE
div가 포함됩니다. 부서 번호 (deptnumber
)와 새 위치 (location
)가 주어지면 부서의 위치를 업데이트 한 다음 반환하는> 문 부서 이름 :
stmt_str := "UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname";
이 예에서는 PL / SQL 변수 , deptname
및 location
. 표 8-4는 DBMS_SQL
패키지 및 네이티브 동적 SQL을 사용하여이 DML 반환 작업을 수행하는 샘플 코드를 보여줍니다.
표 8-4 DBMS_SQL을 사용한 DML 반환 작업 패키지 및 네이티브 동적 SQL
PL / SQL 이외의 애플리케이션 개발 언어
지금까지이 장에서 논의한 내용은 동적 SQL에 대한 PL / SQL 지원에 대해.그러나 다른 애플리케이션 개발 언어를 사용하여 동적 SQL을 사용하는 프로그램을 구현할 수 있습니다. 이러한 애플리케이션 개발 언어에는 C / C ++, COBOL 및 Java가 포함됩니다.
C / C ++를 사용하는 경우 OCI (Oracle Call Interface)와 함께 동적 SQL을 사용하는 응용 프로그램을 개발하거나 Pro * C / C ++ 사전 컴파일러를 사용하여 C에 동적 SQL 확장을 추가 할 수 있습니다. 암호. 마찬가지로 COBOL을 사용하는 경우 Pro * COBOL 사전 컴파일러를 사용하여 COBOL 코드에 동적 SQL 확장을 추가 할 수 있습니다. Java를 사용하는 경우 JDBC와 함께 동적 SQL을 사용하는 애플리케이션을 개발할 수 있습니다.
과거에는 PL / SQL 애플리케이션에서 동적 SQL을 사용하는 유일한 방법은 패키지. 성능 문제를 포함하여이 패키지를 사용하는 데는 여러 가지 제한이 있습니다. 결과적으로 응용 프로그램 개발자는 위에서 설명한 PL / SQL의 대안 중 하나를 사용하여 동적 SQL을 구현했을 수 있습니다. 그러나 PL / SQL에 기본 동적 SQL이 도입됨에 따라 동적 SQL에 PL / SQL을 사용할 때 발생하는 많은 단점이 제거되었습니다.
OCI를 사용하는 애플리케이션이있는 경우 Pro * C / 동적 SQL 실행을위한 C ++ 또는 Pro * COBOL은 동적 SQL 작업을 수행하는 데 필요한 네트워크 왕복으로 인해 성능이 저하 될 수 있습니다. 이러한 응용 프로그램은 일반적으로 클라이언트에 상주하므로 동적 SQL 작업을 완료하려면 더 많은 네트워크 호출이 필요합니다. 이러한 유형의 애플리케이션이있는 경우 동적 SQL 기능을 기본 동적 SQL을 사용하는 PL / SQL의 저장 프로 시저 및 저장 함수로 이동하는 것이 좋습니다. 이렇게하면 저장 프로 시저가 서버에 상주하여 네트워크 오버 헤드가 제거되므로 응용 프로그램의 성능이 향상 될 수 있습니다. 그런 다음 응용 프로그램에서 PL / SQL 저장 프로 시저 및 저장 함수를 호출 할 수 있습니다.
비 PL / SQL 응용 프로그램에서 Oracle 저장 프로 시저 및 저장 함수를 호출하는 방법에 대한 정보 , 참조 :
- Oracle Call Interface Programmer “s Guide
- Pro * C / C ++ Precompiler Programmer”s Guide
- Pro * COBOL Precompiler Programmer “s Guide
- Oracle8i Java Stored Procedures Developer”s Guide