济南做网站建网站公司小网站要备案吗
编辑csm8109022010-01-27 09:59:18
这个问题我以前问过类似的,但一直没得到如意的答案!在oracle 里soctt的用户下的emp表,比如写一个函数,传入的参数为部门编号,然后返回所有该部门人员信息的函数。要用到游标,且要封装信息,该如何写?且能在pl/sql developer里能调试的,谢谢。
给本帖投票
88211打赏收藏1
分享
转发到动态举报
写回复
如何按时间分组,并取最大值啊?>>
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangyunzeng2008 2010-01-28
将返回类型定义为一个table或者是一个cursor
csm810902 2010-01-27
cursor不是游标类型吗?不能写return cursor? c_cursor cursor这样申明一个游标类型的实例c_cursor 不是吗?我是这样理解的
suiziguo 2010-01-27
SYS_REFCURSOR是ORACLE内置ref cursor类型。
 而cursor,只是一个关键字。
csm810902 2010-01-27
对了,我把函数改成这样会报错:
 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,这怎么理解?
csm810902 2010-01-27
ding
csm810902 2010-01-27
嗯,搞定,谢谢你们
suiziguo 2010-01-27
函数在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>
suiziguo 2010-01-27
pl/sql测试窗,下面有所有参数(包括IN and OUT)。
 在测试窗运行过程后,下面的参数栏里有个变量为po_result的值一栏里是<Cursor>
 点击其右边的...按钮,就可以在新窗口里看见你想要的结果集。
csm810902 2010-01-27
suiziguo你好,存储过程在pl/sql developer一般是传入参数调试,然后在数据库里看结果,这里执行过程后,如何在pl/sql developer上看结果(这里是输出10部门的结果)?写函数还真不知道写呢
suiziguo 2010-01-27
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里调试,单独查看游标结果集。
oraclemch 2010-01-27
回复
用游标即可:
  
-  
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; 
