Saltar al contenido

Cursor dinámico en ORACLE FORMS

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.