pl/sql函数如何返回多行数据

用游标即可:
 

SQL code ?

1

2

3

4

5

6

7

8

9

10

11

12

Create  or  REPLACE  FUNCTION  getCursorList(

      P_USER_ID_I           IN    VARCHAR2               --接收输入参数

)

RETURN     SYS_REFCURSOR

AS

      P_RESULT_SET_O          SYS_REFCURSOR;  --返回游标

      X_SQL VARCHAR2(200);

BEGIN

       X_SQL := 'select user_id,user_name,email from user_mst where user_id like ' '%'  || P_USER_ID_I || '%' '' ;    --生成SQL语句

       OPEN  P_RESULT_SET_O  FOR  X_SQL;

       RETURN  P_RESULT_SET_O;     --返回游标

END  getCursorList;

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

suiziguo

suiziguo

本版等级: 

T7

Blank

  

Blank

  

Blank

#2 得分:5回复于: 2010-01-27 10:05:39

SQL> create or replace procedure emp_dept
  2     (pi_deptno    IN       emp.deptno%TYPE,
  3      po_result    OUT      SYS_REFCURSOR)
  4  IS
  5  begin
  6     OPEN po_result FOR
  7        SELECT * FROM emp WHERE deptno=pi_deptno;
  8  end ;
  9  /

过程已创建。

SQL> var r_cur refcursor
SQL> exec emp_dept(10,:r_cur);

PL/SQL 过程已成功完成。

SQL> print :r_cur

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 09-6月 -81           2450
        10

      7839 KING       PRESIDENT            17-11月-81           5000
        10

      7934 MILLER     CLERK           7782 23-1月 -82           1300
        10


SQL>



pl/sql developer里调试,单独查看游标结果集。

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

csm810902

csm810902

本版等级: 

T1

#3 得分:0回复于: 2010-01-27 10:19:16

suiziguo你好,存储过程在pl/sql developer一般是传入参数调试,然后在数据库里看结果,这里执行过程后,如何在pl/sql developer上看结果(这里是输出10部门的结果)?写函数还真不知道写呢

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

suiziguo

suiziguo

本版等级: 

T7

Blank

  

Blank

  

Blank

#4 得分:0回复于: 2010-01-27 10:24:36

pl/sql测试窗,下面有所有参数(包括IN and OUT)。

在测试窗运行过程后,下面的参数栏里有个变量为po_result的值一栏里是<Cursor>
点击其右边的...按钮,就可以在新窗口里看见你想要的结果集。

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

suiziguo

suiziguo

本版等级: 

T7

Blank

  

Blank

  

Blank

#5 得分:5回复于: 2010-01-27 10:30:38

函数在PL/SQL里调试也一样。以下是SQLPLUS里调试:

SQL> CREATE OR REPLACE FUNCTION func_emp_dept
  2        (pi_deptno    IN      emp.deptno%TYPE)
  3  RETURN SYS_REFCURSOR
  4  IS
  5     po_result   SYS_REFCURSOR;
  6  BEGIN
  7     OPEN po_result FOR
  8        SELECT * FROM emp WHERE deptno=pi_deptno;
  9     RETURN po_result;
 10  END;
 11  /

函数已创建。

SQL> select func_emp_dept(10) from dual;

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

CURSOR STATEMENT : 1

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
    DEPTNO
----------
      7782 CLARK      MANAGER         7839 09-6月 -81           2450
        10

      7839 KING       PRESIDENT            17-11月-81           5000
        10

      7934 MILLER     CLERK           7782 23-1月 -82           1300
        10



SQL>

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

csm810902

csm810902

本版等级: 

T1

#6 得分:0回复于: 2010-01-27 10:41:32

嗯,搞定,谢谢你们

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

csm810902

csm810902

本版等级: 

T1

#7 得分:0回复于: 2010-01-27 10:55:37

对了,我把函数改成这样会报错:
create or replace function func_emp_dept(v_deptno IN emp.deptno%TYPE)
  return cursor IS

  c_cursor cursor;
BEGIN
  OPEN c_cursor FOR
    SELECT * FROM emp WHERE deptno = v_deptno;
  RETURN c_cursor;
END;
说必须申明表标CURSOR,这怎么理解?

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

suiziguo

suiziguo

本版等级: 

T7

Blank

  

Blank

  

Blank

#8 得分:2回复于: 2010-01-27 10:57:38

SYS_REFCURSOR是ORACLE内置ref cursor类型。
而cursor,只是一个关键字。

对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理

关注

csm810902

csm810902

本版等级: 

T1

#9 得分:0回复于: 2010-01-27 11:08:09

cursor不是游标类型吗?不能写return cursor? c_cursor cursor这样申明一个游标类型的实例c_cursor  不是吗?我是这样理解的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ok060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值