Oracle
 sql >> база данни >  >> RDS >> Oracle

ИЗБЕРЕТЕ данни ОТ КУРСОРА на ПАКЕТ, отпечатайте ги

Вие сте дефинирали конвейерна функция и това не е начинът да я извикате:

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> 

Трябва да използвате функция TABLE(). Въпреки че тогава ще откриете грешката във вашия код:

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> 

Имайте предвид, че трябваше да убия тази сесия от друга сесия, в противен случай тя все още щеше да работи. Така че нека опростим функцията и да се отървем от този безсмислен втори цикъл...

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;
/

... тогава ето!

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

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

SQL> 

Създадохте конвейерна функция. Защо го направи? Причината, поради която трябваше да направите това, беше, че искахте PL/SQL функция, която може да се използва в клаузата FROM на оператор SELECT. Това е случаят на използване на конвейерните функции. Така че поставянето на повикването в анонимен PL/SQL блок наистина няма смисъл.

Но както и да е.

Моля, прочетете документацията. Той е доста изчерпателен, онлайн е и е безплатен. Съответният раздел в справочника за PL/SQL е главата за статичен SQL. Изяснява се, че изразите SELECT в PL/SQL трябва винаги извлича записи в променлива с някакво описание. Анонимните PL/SQL блокове са същите като съхранените процедури в това отношение. Научете повече .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да стартирате SQL Plus скрипт в PowerShell

  2. Създаване на CTE в Oracle

  3. Oracle:как да INSERT, ако ред не съществува

  4. Regex101 срещу Oracle Regex

  5. Оптимизиране на размера на извличане на JDBC чрез използване на Spring Boots application.properties