http://blog.naver.com/youngsunkr/80032775750
A stored procedure is an executable object stored in a database. Microsoft® SQL Server™ supports:
- Stored procedures
One or more SQL statements precompiled into a single executable procedure.
- Extended stored procedures
C or C++ dynamic-link libraries (DLL) written to the SQL Server Open Data Services API for extended stored procedures. The Open Data Services API extends the capabilities of stored procedures to include C or C++ code.
When executing statements, calling a stored procedure on the data source (instead of directly executing or preparing a statement in the client application) can provide:
- Higher performance
SQL statements are parsed and compiled when procedures are created. This overhead is then saved when the procedures are executed.
- Reduced network overhead
Executing a procedure instead of sending complex queries across the network can reduce network traffic. If an ODBC application uses the ODBC { CALL } syntax to execute a stored procedure, the ODBC driver makes additional optimizations that eliminate the need to convert parameter data.
- Greater consistency
If an organization's rules are implemented in a central resource, such as a stored procedure, they can be coded, tested, and debugged once. Individual programmers can then use the tested stored procedures instead of developing their own implementations.
- Greater accuracy
Because stored procedures are usually developed by experienced programmers, they tend to be more efficient and have fewer errors than code developed multiple times by programmers of varying skill levels.
- Added functionality
Extended stored procedures can use C and C++ features not available in Transact-SQL statements.
To call remote procedures
SQL 문이 ODBC CALL 이스케이프 절을 사용하여 저장 프로시저를 호출하면 Microsoft® SQL Server™ 드라이버는 원격 저장 프로시저 호출(RPC) 메커니즘을 사용하여 SQL Server에 해당 프로시저를 보냅니다. RPC 요청은 SQL Server의 많은 명령문 구문 분석과 매개 변수 처리를 무시하며 Transact-SQL EXECUTE 문을 사용하는 것보다 빠르게 진행됩니다.
RPC로 프로시저를 실행하려면
- ODBC CALL 이스케이프 시퀀스를 사용하는 SQL 문을 만듭니다. 이 명령문은 다음과 같이 각 입력, 입/출력 및 출력 매개 변수에 대해, 그리고 프로시저 반환 값이 있는 경우 이 값에 대해 매개 변수 표식을 사용합니다.
2. {? = CALL procname (?,?)}
- 각 입력, 입/출력 및 출력 매개 변수에 대해, 그리고 프로시저 반환 값이 있는 경우 이 값에 대해 SQLBindParameter를 호출합니다.
- SQLExecDirect를 사용하여 이 명령문을 실행합니다.
참고 응용 프로그램이 ODBC CALL 이스케이프 시퀀스와는 반대로 Transact-SQL EXECUTE 구문을 사용하여 프로시저를 제출할 경우 SQL Server ODBC 드라이브는 RPC가 아닌 SQL 문으로서 SQL Server에 프로시저 호출을 전달합니다. 또한 Transact-SQL EXECUTE 문을 사용할 경우 출력 매개 변수는 반환되지 않습니다.
관련 항목
저장 프로시저 호출 일괄 처리
저장 프로시저 실행
저장 프로시저 호출
SQLBindParameter
프로시저
To process return codes and output parameters
반환 코드 및 출력 매개 변수를 처리하는 방법(ODBC)
Microsoft® SQL Server™ 저장 프로시저는 정수 반환 코드와 출력 매개 변수를 가질 수 있습니다. 반환 코드 및 출력 매개 변수는 서버에서 마지막 패킷에 보내지고 SQLMoreResults가 SQL_NO_DATA를 반환할 때까지 응용 프로그램에서 사용할 수 없습니다.
반환 코드 및 출력 매개 변수를 처리하려면
- ODBC CALL 이스케이프 시퀀스를 사용하는 SQL 문을 만듭니다. 이 명령문은 각 입력, 입/출력 및 출력 매개 변수에 대해, 그리고 프로시저 반환 값이 있는 경우 이 값에 대해 매개 변수 표식을 사용해야 합니다.
- 각 입력, 입/출력 및 출력 매개 변수에 대해, 그리고 프로시저 반환 값이 있는 경우 이 값에 대해 SQLBindParameter를 호출합니다.
- SQLExecDirect를 사용하여 이 명령문을 실행합니다.
- 마지막 결과 집합을 처리하는 동안 SQLFetch 또는 SQLFetchScroll이 SQL_NO_DATA를 반환할 때까지 또는 SQLMoreResults가 SQL_NO_DATA를 반환할 때까지 결과 집합을 처리합니다. 이 때 반환 코드 및 출력 매개 변수에 바운드된 변수를 반환된 데이터 값으로 채웁니다.
예제
다음 예제는 반환 코드 및 출력 매개 변수의 처리를 보여 줍니다. 이 예제를 간단하게 하기 위해 오류 점검 코드를 제거했습니다.
// CREATE PROCEDURE TestParm @OutParm int OUTPUT AS
// SELECT au_lname FROM pubs.dbo.authors
// SELECT @OutParm = 88
// RETURN 99
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
#define MAXBUFLEN 255
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
RETCODE retcode;
// SQLBindParameter variables.
SWORD sParm1=0, sParm2=1;
SDWORD cbParm1=SQL_NTS, cbParm2=SQL_NTS;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
// Allocate ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1, "MyDSN", SQL_NTS,
"sa", SQL_NTS, "MyPassWord", SQL_NTS);
// Allocate statement handle.
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
// Bind the return code to variable sParm1.
retcode = SQLBindParameter(hstmt1,1,SQL_PARAM_OUTPUT,SQL_C_SSHORT,
SQL_INTEGER,0,0,&sParm1,0,&cbParm1);
// Bind the output parameter to variable sParm2.
retcode = SQLBindParameter(hstmt1,2,SQL_PARAM_OUTPUT,SQL_C_SSHORT,
SQL_INTEGER,0,0,&sParm2,0,&cbParm2);
// Execute the command.
retcode = SQLExecDirect(hstmt1, "{? = call TestParm(?)}", SQL_NTS);
// Show parameters are not filled.
printf("Before result sets cleared: RetCode = %d, OutParm = %d.\n",
sParm1, sParm2);
// Clear any result sets generated.
while ( ( retcode = SQLMoreResults(hstmt1) ) != SQL_NO_DATA )
;
// Show parameters are now filled.
printf("After result sets drained: RetCode = %d, OutParm = %d.\n",
sParm1, sParm2);
/* Clean up. */
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
Procedure Parameters
https://docs.microsoft.com/ko-kr/sql/odbc/reference/develop-app/procedure-parameters