CALL

调用使用 DB2 Everyplace Sync Server 的“远程查询和存储过程适配器”定义的存储过程。例如, 在远程数据库位置执行了存储过程,并将数据返回至 DB2 Everyplace 客户机应用程序。

使用 SQL CALL 语句的程序被设计为分两部分运行,一部分在客户机上运行,而另一部分在服务器上运行。

调用

远程存储过程是通过将以下 CALL 语句语法传送至后跟 SQLExecute()SQLPrepare() 从 DB2 Everyplace 应用程序中调用的。

语法

>>-CALL--procedure-name--+-------------+--+------+-------------><
                         |    .-,-.    |  '-(--)-'
                         |    V   |    |
                         '-(----?-+--)-'
 
 

描述

procedure-name
标识要在远程服务器上调用的过程。必须在当前 Sync Server 上的 AgentAdapter 预订中定义标识的过程。
?
CALL 语句语法图中的 ? 指示对应于存储过程的自变量的参数标记。所有自变量必须使用参数标记来传送。

规则

注意事项

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;
 

相关参考