다양한 유형의 파일에서 데이터를 읽어야하는 응용 프로그램을 상속하고 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
(문자열)으로 모든 것을 바인드하므로 오라클이 삽입시 올바른 데이터 유형으로 변환 될 것으로 기대합니다.
그래서, 내 질문 (들)은 다음과 같습니다
무엇제 (그런 일이 SQL/OCI이있는 경우)의 많은 수의 SQL 삽입 문에 대한 바인드 변수를 사용하는/적절한 관용적 열/매개 변수? 보다 일반적으로 OCI를 사용하여 이러한 유형의 커다란 삽입 문을 만드는 가장 좋은 방법은 무엇입니까?
많은 바인드 호출이 바닐라 C 문자열을 작성하고 사용하는 것과 비교할 때 효율성면에서 상당한 비용이 드나요?
모든 변수를 문자열로 바인딩하고 Oracle에서 적절한 유형 변환을 수행하는 데 위험이 있습니까?
미리 감사드립니다.
답변 해 주셔서 감사합니다.따라서 올바르게 이해한다면이 성능 향상은 * 모든 * 열이 바인딩 된 경우에만 적용됩니다. 따라서 여러 열에서 하나의 열을 바인딩하지 않기로 선택해도 다른 SQL 텍스트가 생겨 성능이 저하 될 수 있습니다. – nbrooks3
네, 맞습니다. – Marius