2014-07-12 3 views
2

다양한 유형의 파일에서 데이터를 읽어야하는 응용 프로그램을 상속하고 OCI 인터페이스를 사용하여 데이터를 Oracle 데이터베이스로 이동합니다. 문제가되는 대부분의 테이블에는 약 40-50 개의 열이 있으므로 SQL 삽입 문은 상당히 길어집니다.큰 삽입 문에서 바인드 변수 사용

이 코드를 상속 받았을 때 기본적으로 일련 번호 strcat을 통해 C 문자열로 insert 문을 작성한 다음 적절한 OCI 함수에 전달하여 문을 설정하고 실행했습니다. 그러나 많은 양의 데이터가 파일에서 열 값으로 직접 읽혀지기 때문에 응용 프로그램이 쉽게 SQL 주입이 가능합니다. 그래서이 문제를 해결하기 위해 바인드 변수를 사용하려고합니다.

각 예제 OCI 응용 프로그램에서 각 변수는 정적으로 할당되고 개별적으로 바인딩됩니다. 이것은 상당 부분의 상용구 (boilerplate)로 이어질 것입니다. 그러나 저는 그것을 일종의 루핑 구조로 축소하고 싶습니다.

void makePlaceholder(char *buf, const char *col); 
// "COLUMN_NAME" -> ":column_name" 
: 열 이름 밖으로 자리하게 짧은 함수와 함께

const char const *TABLE_NAME[N_COLS] = { 
    "COL_1", 
    "COL_2", 
    "COL_3", 
    ... 
    "COL_N" 
}; 

: 그래서 내 용액을 각 테이블은 테이블 컬럼의 이름을 포함하는 문자열의 고정 배열을 생성하는 것이다

그래서 각 배열을 반복하고 값을 각 열에 바인딩하여 자리 표시자를 생성합니다. 한 가지 잠재적 인 문제는 각 열의 유형이 다양하므로 SQLT_STR (문자열)으로 모든 것을 바인드하므로 오라클이 삽입시 올바른 데이터 유형으로 변환 될 것으로 기대합니다.

그래서, 내 질문 (들)은 다음과 같습니다

무엇
  1. 제 (그런 일이 SQL/OCI이있는 경우)의 많은 수의 SQL 삽입 문에 대한 바인드 변수를 사용하는/적절한 관용적 열/매개 변수? 보다 일반적으로 OCI를 사용하여 이러한 유형의 커다란 삽입 문을 만드는 가장 좋은 방법은 무엇입니까?

  2. 많은 바인드 호출이 바닐라 C 문자열을 작성하고 사용하는 것과 비교할 때 효율성면에서 상당한 비용이 드나요?

  3. 모든 변수를 문자열로 바인딩하고 Oracle에서 적절한 유형 변환을 수행하는 데 위험이 있습니까?

미리 감사드립니다.

답변

1

이 C 측면에 대해 확실하지 않습니다. 내 답변은 DBA 관점에서 나옵니다.

질문 2 : 항상 바인드 변수를 사용하십시오. SQL 인젝션을 방지하고 성능을 향상시킵니다.

성능 측면은 종종 프로그래머가 간과합니다. 오라클은 SQL을 받으면 전체 SQL 텍스트의 해시를 만들고 내부에 실행 계획의 저장소가 있는지 살펴 봅니다. 바인드 변수가 사용 된 경우 변수의 값이 무엇이든 관계없이 쿼리를 실행할 때마다 SQL 텍스트가 동일하게됩니다. 그러나 문자열을 연결했다면 오라클은 매번 고유 한 해시를 얻는 등의 변수를 포함하여 SQL 텍스트를 해시합니다. 따라서 바인드 변수를 사용하면 오라클은 1 회의 실행 계획을 세우고, 바인드 변수를 사용하지 않으면 100 만회의 실행 계획을 세우고이를 수행하는 리소스를 낭비합니다.

+0

답변 해 주셔서 감사합니다.따라서 올바르게 이해한다면이 성능 향상은 * 모든 * 열이 바인딩 된 경우에만 적용됩니다. 따라서 여러 열에서 하나의 열을 바인딩하지 않기로 선택해도 다른 SQL 텍스트가 생겨 성능이 저하 될 수 있습니다. – nbrooks3

+0

네, 맞습니다. – Marius