¿Cómo obtener el tipo de declaración OCI_ATTR_SQLFNCODE * antes de * OCIStatementExecute ()?
Frecuentes
Visto 410 veces
1
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?
1 Respuestas
3
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 c oracle oracle10g oracle-call-interface or haz tu propia pregunta.