Parameter-value array

The parameter-value array, values, is the fifth argument of the mi_exec_prepared_statement() and mi_open_prepared_statement() functions. Each element of the parameter-value array is a pointer to an MI_DATUM structure that holds the value for each input parameter.

The format of this value depends on:
  • Whether the control mode for the input-parameter data is text or binary representation:

    The params_are_binary argument of mi_exec_prepared_statement() or mi_open_prepared_statement() indicates this control mode. For more information about the format of data for different control modes, see Table 1.

  • In binary representation, whether the MI_DATUM value is passed by reference or by value:
    • For C UDRs, the data type of the value determines the passing mechanism.
    • For client LIBMI applications, pass all values (regardless of data type) by reference.
For the prepared INSERT statement in Figure 1, the following code fragment assigns values to the input parameters for the customer_num and company columns. These values are in text representation because the params_are_binary argument of mi_exec_prepared_statement() is MI_FALSE.
/* Initialize input parameter for customer_num column */
values[0] = "0"; /* value of '0' for SERIAL customer_num */
lengths[0] = 0; /* SERIAL is built-in type: no length */
types[0] = "serial";
nulls[0] = MI_FALSE;

/* Initialize input parameter for company column */
stcopy("Trievers Inc.", strng);
values[1] = strng;
lengths[1] = stleng(strng); /* CHAR types need length! */
types[1] = "char(20)";
nulls[1] = MI_FALSE;

/* Send INSERT statement to database server for execution along 
 * with the input-parameter-value arrays
 */
mi_exec_prepared_statement(insrt_stdesc, 0, MI_FALSE, 2
   values, lengths, nulls, types, 0, NULL);
Server only:
The following code fragment initializes the input parameters to the same values but it assigns these values in binary representation instead of text representation:
/* Initialize input parameter for customer_num column */
values[0] = 0; /* value of 0 for SERIAL customer_num */
lengths[0] = 0; /* SERIAL is built-in type: no length */
types[0] = "serial";
nulls[0] = MI_FALSE;

/* Initialize input parameter for company column */
values[1] = mi_string_to_lvarchar("Trievers Inc.");
lengths[1] = 0; /* CHAR types need length! */
types[1] = "char(20)";
nulls[1] = MI_FALSE;

/* Send INSERT statement to database server for execution along
 * with the input-parameter-value arrays
 */
mi_exec_prepared_statement(insrt_stdesc, 0, MI_TRUE, 2
   values, lengths, nulls, types, 0, NULL);
In the preceding code fragment, the first element of the values array is assigned an integer value. Because this code executes in a C UDR, the integer value in the MI_DATUM structure of this array must be passed by value.
Client only:

In a client LIBMI application, all values in MI_DATUM structure must be passed by reference. Therefore, to assign values to input parameters within a client LIBMI application, you must assign all values in the values array as pointers to the actual values.

The preceding code fragment assumes that it executes within a C UDR because it passes the value for the first input parameter (an INTEGER column by value). In a client LIBMI application, you cannot use the pass-by-value mechanism. Therefore, the assignment to the first input parameter must pass a pointer to the integer value, as follows:
col1 = 0;
values[0] = &col1;

Copyright© 2019 HCL Technologies Limited