Aquí os dejo como crear un cursor dinámico en forms. Es la única manera que hemos visto, ya que los IMMEDIATE EXECUTE no estaban soportados en los programas instalados en el cliente:
PROCEDURE cursor IS str_sql VARCHAR2(255); l_cnt VARCHAR2(20); BEGIN str_sql := 'SELECT count(*) FROM PAISES'; EXECUTE IMMEDIATE str_sql INTO l_cnt; message(l_cnt); END; |
Tampoco pudimos así:
PROCEDURE cursor IS TYPE CUR_TYP IS REF CURSOR; c_cursor CUR_TYP; fila test%ROWTYPE; v_query VARCHAR2(255); BEGIN v_query := 'SELECT * FROM test'; OPEN c_cursor FOR v_query; LOOP FETCH c_cursor INTO fila; EXIT WHEN c_cursor%NOTFOUND; dbms_output.put_line(fila.DESCRIPCION); END LOOP; CLOSE c_cursor; END; |
Al final obtamos por hacerlo así, utilizando el modo NATIVE al hacer el PARSE.
PROCEDURE cursor IS my_cursor INTEGER; FILAS_PROCESADAS INTEGER; id NUMBER; valor VARCHAR2(45); SQLSEN VARCHAR2(70); BEGIN SQLSEN := 'SELECT id, valor FROM test '; my_cursor:= DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE (my_cursor, SQLSEN , 1); DBMS_SQL.DEFINE_COLUMN (my_cursor, 1, id); DBMS_SQL.DEFINE_COLUMN (my_cursor, 2, VALOR, 45); FILAS_PROCESADAS:= DBMS_SQL.EXECUTE (my_cursor); LOOP IF DBMS_SQL.FETCH_ROWS (my_cursor) > 0 THEN DBMS_SQL.COLUMN_VALUE (my_cursor, 1, id); DBMS_SQL.COLUMN_VALUE (my_cursor, 2, valor); message(TO_CHAR(id) || ' ' || valor); message(TO_CHAR(id) || ' ' || valor); ELSE EXIT; END IF; END LOOP; DBMS_SQL.CLOSE_CURSOR (my_cursor); END; |
Este procedimiento lo podreís llamar desde cualquier punto y os mostará por pantalla los registros de esa tabla.