하드 코딩된 SQL 문

고정 작업을 수행하는 애플리케이션에는 일반적으로 하드 코딩된 SQL 문이 포함됩니다. 예를 들어 주문 입력 시스템은 다음 호출을 사용하여 열린 판매 주문을 나열할 수 있습니다.

SQLExecDirect(hstmt, "SELECT OrderID FROM Orders WHERE Status = 'OPEN'", SQL_NTS);  

하드 코딩된 SQL 문에는 몇 가지 장점이 있습니다. 애플리케이션을 작성할 때 테스트할 수 있습니다. 런타임에 생성된 문보다 구현이 더 간단합니다. 애플리케이션을 간소화합니다.

문 매개 변수를 사용하고 문을 준비하면 하드 코딩된 SQL 문을 사용하는 더 나은 방법을 제공합니다. 예를 들어 파트 테이블에 PartID, Description 및 Price 열이 포함되어 있다고 가정합니다. 이 테이블에 새 행을 삽입하는 한 가지 방법은 INSERT 문을 생성하고 실행하는 것입니다.

#define DESC_LEN 51  
#define STATEMENT_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN], Statement[STATEMENT_LEN];  
SQLREAL       Price;  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Build INSERT statement.  
sprintf_s(Statement, 100, "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (%d, '%s', %f)", PartID, Desc, Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

더 좋은 방법은 하드 코딩된 매개 변수가 있는 문을 사용하는 것입니다. 이렇게 하면 하드 코딩된 데이터 값이 있는 문보다 두 가지 이점이 있습니다. 첫째, 데이터 값을 문자열로 변환하는 대신 정수 및 부동 소수점 숫자와 같은 네이티브 형식으로 보낼 수 있으므로 매개 변수가 있는 문을 쉽게 생성할 수 있습니다. 둘째, 이러한 문은 매개 변수 값을 변경하고 다시 인덱싱하여 두 번 이상 사용할 수 있습니다. 다시 빌드할 필요가 없습니다.

#define DESC_LEN 51  
  
SQLCHAR * Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Set part ID, description, and price.  
GetNewValues(&PartID, Desc, &Price);  
  
// Execute the statement.  
SQLExecDirect(hstmt, Statement, SQL_NTS);  

이 문을 두 번 이상 실행해야 한다고 가정하면 효율성을 더욱 높일 수 있도록 준비할 수 있습니다.

#define DESC_LEN 51  
  
SQLCHAR *Statement = "INSERT INTO Parts (PartID, Description,  Price) "  
         "VALUES (?, ?, ?)";  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Prepare the INSERT statement.  
SQLPrepare(hstmt, Statement, SQL_NTS);  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecute(hstmt);  

다음 코드 예제와 같이 문을 사용하는 가장 효율적인 방법은 문을 포함하는 프로시저를 생성하는 것입니다. 프로시저는 개발 시 생성되고 데이터 원본에 저장되므로 런타임에 준비할 필요가 없습니다. 이 메서드의 단점은 프로시저를 만들기 위한 구문이 DBMS별이며 애플리케이션이 실행될 각 DBMS에 대해 프로시저를 별도로 생성해야 한다는 것입니다.

#define DESC_LEN 51  
  
SQLUINTEGER   PartID;  
SQLCHAR       Desc[DESC_LEN];  
SQLREAL       Price;  
SQLINTEGER    PartIDInd = 0, DescLenOrInd = SQL_NTS, PriceInd = 0;  
  
// Bind the parameters.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &PartID, 0, &PartIDInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0,  
                  Desc, sizeof(Desc), &DescLenOrInd);  
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
  
// Loop to continually get new values and insert them.  
while (GetNewValues(&PartID, Desc, &Price))  
   SQLExecDirect(hstmt, "{call InsertPart(?, ?, ?)}", SQL_NTS);  

매개 변수, 준비된 문 및 프로시저에 대한 자세한 내용은 문 실행을 참조 하세요.