如何从 table 创建 oracle PL/SQL 函数到 store/retrieve 数据

How to Create oracle PL/SQL function to store/retrieve data from table

我是初学者,所以我很困惑我应该用 return 类型写什么。

以及如何将函数写入 select 来自特定 ID

的所有记录
2   shadik  27  25-05-14    4000    pakistan
1   AKSHAY  28  30-04-20    2000    INDIA
3   GAURANG 25  06-05-20    4000    USA
4   NIRAV   23  16-11-14    1000    CANADA
5   VEER    29  26-12-19    5000    DUBAI

一个简单的选择是return refcursor;您不必为此声明任何类型。

这是一个基于 Scott 示例架构的示例。函数 returns 来自 EMP table 的所有行,其 DEPTNO 列匹配作为函数的 IN 参数传递的值。

SQL> create or replace function f_test (par_deptno in number)
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for select * from emp
  7                where deptno = par_deptno;
  8    return rc;
  9  end;
 10  /

Function created.

SQL> select f_test(10) from dual;

F_TEST(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7839 KING       PRESIDENT            17.11.81       5000                    10
      7934 MILLER     CLERK           7782 23.01.82       1300                    10


SQL>

虽然这有点自定义,但您可以使用类型从函数中 return 行。


create or replace type myRecordType
 as object
 ( x int,
 y date,
 z varchar2(25)
 )
 

create or replace type myTableType
 as table of myRecordType;
/

create or replace function my_function return myTableType
 as
 some_data myTableType := myTabletype();
 begin
 for i in 1 .. 10 loop
 some_data.extend;
 some_data(i) :=
 myRecordType( i, sysdate+i, 'record ' || i );
 end loop;
 return some_data;
 end;
 /

select * from TABLE ( cast( my_function() as mytableType ) )
 /

X    Y    Z
1    09-FEB-22    record 1
2    10-FEB-22    record 2
3    11-FEB-22    record 3
4    12-FEB-22    record 4
5    13-FEB-22    record 5
6    14-FEB-22    record 6
7    15-FEB-22    record 7
8    16-FEB-22    record 8
9    17-FEB-22    record 9
10    18-FEB-22    record 10