CALL

Invoca a un procedimiento almacenado definido con el adaptador de Consulta remota y Procedimiento almacenado para el DB2 Everyplace Sync Server. Por ejemplo, un procedimiento almacenado se ejecuta en la ubicación de la base de datos remota y devuelve los datos a la aplicación cliente de DB2 Everyplace.

Los programas que utilizan la sentencia de SQL CALL están diseñados para que se ejecuten en dos partes, una en el cliente y la otra en el servidor.

Invocación

Los procedimientos almacenados remotos se invocan desde una aplicación de DB2 Everyplace pasando la sintaxis de sentencia CALL siguiente a SQLPrepare(), seguida por SQLExecute().

Sintaxis

>>-CALL--nombre-procedimiento--+-------------+--+------+-------><
                               |    .-,-.    |  '-(--)-'
                               |    V   |    |
                               '-(----?-+--)-'
 
 

Descripción

nombre-procedimiento
Identifica el procedimiento que se debe llamar en el servidor remoto. El procedimiento identificado debe estar definido en la suscripción AgentAdapter del Sync Server actual.
?
El signo de interrogación ? en el diagrama de la sintaxis de la sentencia CALL denota un marcador de parámetro que se corresponde a un argumento para un procedimiento almacenado. Todos los argumentos se deben pasar utilizando los marcadores de parámetros.

Reglas

Ninguna

Notas

La sentencia CALL utiliza el adaptador de consulta remota y procedimiento almacenado que se incluye con el DB2 Everyplace Sync Server. DB2 Everyplace Sync Server debe utilizar la sentencia CALL en aplicaciones de DB2 Everyplace. DB2 Everyplace no da soporte a procedimientos almacenados locales.

Para obtener información adicional, consulte la sección sobre fuentes de datos en el manual DB2 Everyplace Sync Server Administration Guide.

Ejemplo

Un ejemplo completo sobre cómo utilizar la sentencia CALL y el adaptador de consulta remota y procedimiento almacenado está disponible en el manual DB2 Everyplace Sync Server Administration Guide. El ejemplo siguiente sólo muestra el código de la sentencia CALL en una aplicación de ejemplo.

Se define un procedimiento almacenado MYPROC() en el servidor fuente para la base de datos mysample. Se define una suscripción AgentAdapter en el DB2 Everyplace Sync Server con los atributos siguientes:

ID de usuario:  db2admin
Contraseña:  db2admin
Otros:  dbname=mysample;procname= db2e.MYPROC
 

Programa de ejemplo utilizando la sentencia 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 : Transfer 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;
 

Consulta relacionada