|
|
|
|
- Presentación
- ¿Cómo proceder?
- Etapas
- Observaciones
- Ejemplo
- 1. Declaración de la fuente de datos
- 2. Declarando las variables utilizadas por la Procedure
- 3. Ejecutar la consulta y recuperar el resultado
- Funciones y procedimientos que devuelven un cursor
- Principio
- Ejemplo: Función que devuelve un cursor
- Ejemplo: Procedure con un parámetro de cursor
Conector Nativo Oracle: Recuperar el valor de salida de un Procedure almacenado
Disponible solo con este tipo de conexión
El Conector Nativo Oracle (también llamado Native Oracle Access) está acostumbrado a: - especificar los valores de entrada durante la llamada a un Procedure almacenado.
- recuperar los valores de salida después de una llamada a un Procedure almacenado.
Observaciones: - También tiene la posibilidad de utilizar variables en cualquier tipo de consulta.
- También se pueden ejecutar las funciones y los procedimientos que devuelven un cursor.
If la consulta debe ejecutarse varias veces, puede preparar la consulta a ejecutar ( HPrepareSQLQuery) así como los diferentes parámetros a modificar, luego ejecutar la consulta tantas veces como sea necesario con HExecuteSQLQuery. Esta solución optimiza el tiempo necesario para examinar el resultado de la consulta (para una consulta SELECT). Etapas Para especificar y recuperar valores al ejecutar una consulta, debe hacerlo: - Declarar una fuente de datos. Esta fuente de datos contendrá el resultado de la consulta SQL.
- Declarar las diferentes variables de consulta (variables de entrada y salida).
Las variables se recuperan en el tipo especificado en WLanguage. Las variables son variables de texto de Default. Por lo tanto, pueden ocurrir conversiones entre el tipo nativo de la base de datos y el tipo WLanguage, causando errores inesperados de redondeo o formato (la fecha se transforma en cadena, por ejemplo).. Por lo tanto, le aconsejamos que especifique los tipos de WLanguage de las variables con mucho cuidado antes de ejecutar la consulta. Para esto:- inicializar el valor de la Variable (tipos simples: entero, string, float)
- especificar el tipo esperado con escribir a máquina (no soportado en esta versión)
- Ejecute la consulta con HExecuteSQLQuery.
Observaciones - HExecuteSQLQuery debe utilizarse con:
- el nombre de la conexión,
- la constante hQueryWithoutCorrection.
- Las variables declaradas deben ser idénticas a las utilizadas. De lo contrario, se produce un error WLanguage.
- En la llamada a la Procedure almacenada, se debe utilizar la sintaxis específica de la base de datos utilizada, incluso para la sintaxis de los parámetros. Por lo tanto, para Oracle, los parámetros se especifican con la sintaxis :ParamName.. Atención: el carácter ":" debe ir seguido de al menos una letra (la sintaxis:1 no está permitida).
El mismo parámetro se puede utilizar varias veces. En este caso, la Variable correspondiente será reutilizada. - Para ejecutar una consulta sin habilitar el enlace, use la constante hNoBind en HExecuteSQLQuery.
La Procedure almacenada 'sp_cut(n,str)' trunca la cadena 'str' después de los primeros 'n' caracteres y devuelve la longitud anterior de la cadena. - n es la entrada Variable.
- str es un Variable de entrada/salida.
1. Declaración de la fuente de datos La fuente de datos se utiliza para manipular las variables del Procedure que deben ser ejecutadas. 2. Declarando las variables utilizadas por la Procedure Las variables que maneja el Procedure se declaran desde la fuente de datos.
MyProc.n = 3 // Automatically declares an integer initialized to 3 MyProc.str = "Example"
Observación: No es necesario declarar todas las variables utilizadas. En este ejemplo, la variable utilizada para recuperar el resultado de la Procedure no se declara. 3. Ejecutar la consulta y recuperar el resultado
HExecuteSQLQuery(MyProc, Connection, hQueryWithoutCorrection, "begin:Res:=sp_cut(:n,:str);end;") Info(MyProc.Res)
Después de la ejecución de la consulta, el MyProc.str Variable contiene "exa" y el MyProc.res Variable contiene 7. Funciones y procedimientos que devuelven un cursor Principio Si la consulta no devuelve 'resultset' pero si uno de sus parámetros es un cursor (el valor de retorno se procesa como un parámetro OUT), el cursor se navega como si fuera el resultado de la consulta. Observaciones: - HPrepareSQLQuery no se puede utilizar para inicializar la navegación del cursor.. Debe llamar directamente a HExecuteSQLQuery.
- El nombre del parámetro de cursor o el nombre del valor de retorno del cursor debe ser fijado por "%CURSOR" para que el Conector Nativo pueda realizar un enlace de un parámetro de cursor..
Ejemplo: Función que devuelve un cursor - Creación de la fuente tabla de datos:
CREATE TABLE frm_user(user_name VARCHAR2(20)); INSERT INTO frm_user VALUES ('toto'); INSERT INTO frm_user VALUES ('titi'); INSERT INTO frm_user VALUES ('tutu'); COMMIT;
- Función que devuelve un cursor:
CREATE OR REPLACE FUNCTION display_user RETURN SYS_REFCURSOR AS vRefCursor SYS_REFCURSOR; begin OPEN vRefCursor FOR SELECT user_name, upper(user_name) FROM frm_user; RETURN vRefCursor; end;
- Código WLanguage utilizado para ejecutar la función y navegar por el resultado:
myProcedure is Data Source IF NOT HExecuteSQLQuery(myProcedure, connectionOracle, hQueryWithoutCorrection, ... "begin:return_value%CURSOR:= display_user(); end;") THEN Error("Error on HExecuteSQLQuery", "", HErrorInfo(hErrFullDetails)) RETURN ELSE FOR EACH myProcedure Trace(HRecordToString(myProcedure)) END END
El rastro contiene:
Ejemplo: Procedure con un parámetro de cursor - Creación de la fuente tabla de datos:
CREATE TABLE frm_user(user_name VARCHAR2(20)); INSERT INTO frm_user VALUES ('toto'); INSERT INTO frm_user VALUES ('titi'); INSERT INTO frm_user VALUES ('tutu'); COMMIT;
- Procedure con un parámetro de cursor:
CREATE OR REPLACE PROCEDURE Proc_display_user(O_RESULT_SET OUT SYS_REFCURSOR) AS BEGIN OPEN O_RESULT_SET FOR SELECT user_name, upper(user_name) FROM frm_user; END;
- El código de lenguaje WLanguage usado para ejecutar el Procedure y para navegar por el resultado:
myProcedure is Data Source IF NOT HExecuteSQLQuery(myProcedure, connectionOracle, hQueryWithoutCorrection, ... "begin Proc_display_user(:return_value%CURSOR); end;") THEN Error("Error on HExecuteSQLQuery", "", HErrorInfo(hErrFullDetails)) RETURN ELSE FOR EACH myProcedure Trace(HRecordToString(myProcedure)) END END
El rastro contiene:
Esta página también está disponible para…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|