调用使用 DB2 Everyplace Sync Server 的“远程查询和存储过程适配器”定义的存储过程。例如, 在远程数据库位置执行了存储过程,并将数据返回至 DB2 Everyplace 客户机应用程序。
使用 SQL CALL 语句的程序被设计为分两部分运行,一部分在客户机上运行,而另一部分在服务器上运行。
调用
远程存储过程是通过将以下 CALL 语句语法传送至后跟 SQLExecute() 的 SQLPrepare() 从 DB2 Everyplace 应用程序中调用的。
语法
>>-CALL--procedure-name--+-------------+--+------+------------->< | .-,-. | '-(--)-' | V | | '-(----?-+--)-'
描述
规则
无
注意事项
CALL 语句使用 DB2 Everyplace Sync Server 附带包括的远程查询和存储过程适配器。DB2 Everyplace Sync Server 是在 DB2 Everyplace 应用程序中使用 CALL 语句所必需的。DB2 Everyplace 不支持本地存储过程。
有关附加信息,请参阅《DB2 Everyplace Sync Server 管理指南》的『数据源』一节。
示例
《DB2 Everyplace Sync Server 管理指南》中提供了如何使用 CALL 语句和远程查询和存储过程适配器的完整示例。以下样本仅显示样本应用程序中的 CALL 语句的编码。
存储过程 MYPROC() 是在数据库 mysample 的源服务器上定义的。AgentAdapter 预订是在带有下列属性的 DB2 Everyplace Sync Server 上定义的:
User ID: db2admin Password: db2admin Other: dbname=mysample;procname= db2e.MYPROC
使用 CALL 语句的样本程序:
int main(int argc, char * argv[]) { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN rc; SQLCHAR strSQL[] = "CALL db2e.MYPROC(?,?,?,?,?)"; int nInd4, nInd5; int nSaving = 0, nChecking =0 ; int nCmd =0, nAmount=0; SQLCHAR strConnect[254]; //**************************************************************** //* Check input parameters //**************************************************************** if ( argc < 4 ){ printf("\nUsage : myClient AccountName Cmd Amount"); printf("\n cmd 1 : query balance"); printf("\n cmd 2 : Transfer from Saving to Checking"); printf("\n cmd 3 : Trnasfer from Checking to Saving"); return (99); } nCmd = atoi(argv[2]); nAmount = atoi(argv[3]); //**************************************************************** //* Allocate handles //**************************************************************** rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv; //checkerror rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc); //checkerror if (argc == 5){ strcpy(strConnect,"http://"); strcat(strConnect,argv[4]); strcat(strConnect,"/servlet/com.ibm.mobileservices.adapter.agent.AgentServlet?DB=mysample"); }else{ strcpy(strConnect, "http://127.0.0.1:8080/db2e/servlet/ com.ibm.mobileservices.adapter.agent.AgentServlet?DB=mysample"); } //**************************************************************** //* Connect to remote database //**************************************************************** rc = SQLConnect(hdbc, strConnect, SQL_NTS, "userex", SQL_NTS, "userex", SQL_NTS ); //checkerror rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt); //checkerror //**************************************************************** //* Prepare, Bind , and Execute the statement //**************************************************************** rc = SQLPrepare(hstmt,strSQL, SQL_NTS); //checkerror rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, (SQLPOINTER)argv[1], 0, NULL ); //checkerror rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nCmd, sizeof(int), NULL); //checkerror rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nAmount, sizeof(int), NULL ); //checkerror rc = SQLBindParameter(hstmt, 4, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nSaving, sizeof(int), &nInd4 ); //checkerror rc = SQLBindParameter(hstmt, 5, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&nChecking, sizeof(int), &nInd5 ); //checkerror rc = SQLExecute(hstmt); //checkerror //**************************************************************** //* Print the balance //**************************************************************** printf("\nSaving = %d",nSaving); printf("\nChecking = %d",nChecking); SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0;
相关参考