sql >> Base de Datos >  >> RDS >> Oracle

SELECCIONE los datos DESDE EL CURSOR del PAQUETE, imprímalos

Ha definido una función segmentada y esta no es la forma de llamarla:

SQL> begin
  2  Cursor_pkg_func.f_trans(5);
  3  end;
  4  /
Cursor_pkg_func.f_trans(5);
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00221: 'F_TRANS' is not a procedure or is undefined
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored


SQL> 

Necesita usar una función TABLE(). Aunque luego descubrirás el error en tu código:

SQL>  select * from table(Cursor_pkg_func.f_trans(5))
  2   /

SMITH
SMITH
SMITH
''''
SMITH
SMITH
SMITH
SMITH
ERROR:
ORA-00028: your session has been killed



273660 rows selected.

SQL> 

Tenga en cuenta que tuve que eliminar esa sesión de otra sesión, de lo contrario, aún estaría ejecutándose. Así que simplifiquemos la función y deshagámonos de ese segundo bucle sin sentido...

CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
    FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
    out_rec outrec_typ;
    BEGIN
        OPEN Cursor_pkg.C1;
        LOOP
            FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
            EXIT when Cursor_pkg.C1%NOTFOUND;
            out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
            PIPE ROW(out_rec);
        END LOOP;
        CLOSE Cursor_pkg.C1;
     RETURN;
     END f_trans;
END Cursor_pkg_func;
/

.... entonces mira!

SQL> select * from table(Cursor_pkg_func.f_trans(5))
  2  /

VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH

SQL> 

Ha creado una función canalizada. ¿Por qué hiciste eso? La razón por la que debería haber hecho eso era porque quería una función PL/SQL que pudiera usarse en la cláusula FROM de una declaración SELECT. Ese es el caso de uso de las funciones segmentadas. Entonces poner la llamada en un bloque PL/SQL anónimo realmente no tiene sentido.

Pero de todos modos.

Por favor, lea la documentación. Es bastante completo, es online y gratuito. La sección pertinente en la Referencia de PL/SQL es el capítulo sobre SQL estático. Deja claro que las sentencias SELECT en PL/SQL deben siempre buscar registros en una variable de alguna descripción. Los bloques PL/SQL anónimos son lo mismo que los procedimientos almacenados en este sentido. Más información .