¿Cómo obtener el tipo de declaración OCI_ATTR_SQLFNCODE * antes de * OCIStatementExecute ()?

Necesito saber cómo obtener el tipo de declaración de un identificador de declaración preparado en OCI.

El dilema es el siguiente. El cuarto argumento de OCIStmtExecute() - iters - no puede ser 0 si la declaración no es un SELECT, Pero debe: be 0 si la declaración is a SELECT (y las definiciones no se pueden hacer antes de tiempo). De la documentación de OCI 10g para OCIStmtExecute:

Para declaraciones que no son SELECT, el número de veces que se ejecuta esta declaración es igual a iters - rowoff.

Para declaraciones SELECT, si iters es distinto de cero, entonces se deben haber realizado definiciones para el identificador de declaración. La ejecución recupera filas iters en estos búferes predefinidos y obtiene más filas según el recuento de filas de captación previa. Si no sabe cuántas filas recuperará la instrucción SELECT, establezca iters en cero.

Esta función devuelve un error si iters=0 para declaraciones que no son SELECT.

Para una declaración como SELECT * ..., es imposible saber lo que las columnas incluso Fuck Cancer. antes de obtener la describe información del identificador de declaración, que solo está disponible después de OCIStmtExecute() se llama. (Entonces, no es posible hacer defines en el identificador de declaración antes de tiempo.) Por lo tanto, debo pasar 0 es iters si el tipo de declaración (desconocido) es SELECT. Pero si el tipo de declaración (desconocido) es no SELECT, OCI devuelve un error si iters is 0 (tal como dice la documentación).

La forma documentada de obtener el tipo de declaración (SELECT o no) es consultando un atributo del identificador de declaración, de la siguiente manera:

ub2 statementType = 0;
OCIAttrGet(mystmt, OCI_HTYPE_STMT, (dvoid*)(&statementType), NULL, OCI_ATTR_SQLFNCODE, myerrhp);

Desafortunadamente, esta función siempre devoluciones 0 es statementType hasta después de OCIStmtExecute() se llama.

Estoy en una situación catch-22. debo llamar OCIAttrGet() antes de llamar OCIStmtExecute() para obtener el tipo de sentencia con el fin de establecer iters adecuadamente. Sin embargo, debo llamar OCIStmtExecute() antes OCIAttrGet() podría suceder.

He intentado llamar OCIStmtExecute() dos veces, la primera vez que pasa OCI_DESCRIBE_ONLY para el parámetro final (mode). Desafortunadamente, OCIStmtExecute() aun da el error relacionado con iters en este caso.

(Tenga en cuenta: el identificador de declaración mystmt ha sido debidamente preparado con anticipación, con éxito, con una llamada a OCIStmtPrepare2(), y el controlador de error myerrhp también se ha asignado correctamente.)

¿Qué hago?

preguntado el 09 de marzo de 12 a las 22:03

1 Respuestas

Use el OCI_ATTR_STMT_TYPE en cambio: está disponible justo después OCIStmtPrepare y se puede usar para determinar crudamente el tipo de declaración (es decir, también si se trata de una declaración de "selección").

respondido 23 nov., 12:11

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.