日期:2014-05-17  浏览次数:20775 次

用游标输出,看看错在哪?
该函数功能是这样的:当输入一个部门编号时,输出该部门的员工的所有信息。(oracle自带scott用户下的emp表)
create or replace function c_re(v_deptno in emp.deptno%type) return c_cursor
is
  c_cursor cursor;
  cursor c_cursor is select * from emp where deptno=v_deptno;
  v_emp c_cursor%rowtype;
begin
  open c_cursor;
  fetch c_cursor into v_emp;
  return v_emp;
 close c_cursor;
end;
编译后第一行报错为:1 PLS-00320:此表达式的类型声明不完整或格式不正确,请好手指点。怎么改正?或写出你的函数也行

------解决方案--------------------
看见很多人调试过程依然使用DBMS_OUTPUT.PUT_LINE进行着输出,或是对oracle procedure返回resultset比较疑惑,下面的例子仅供参考。

 

Sql代码 
CREATE OR REPLACE PROCEDURE sp_test (
p_outstr OUT VARCHAR2
,p_outint OUT NUMBER
,p_ref1 OUT SYS_REFCURSOR
,p_ref2 OUT SYS_REFCURSOR
)
AS
BEGIN
p_outstr := 'abc';
p_outint := '56789';
OPEN p_ref1 FOR SELECT ROWNUM*2 AS RN FROM DUAL CONNECT BY ROWNUM<=10;
OPEN p_ref2 FOR SELECT ROWNUM*2+1 AS RN FROM DUAL CONNECT BY ROWNUM<=10;

END sp_test;
  
/
  
过程已创建。

CREATE OR REPLACE PROCEDURE sp_test (
p_outstr OUT VARCHAR2
,p_outint OUT NUMBER
,p_ref1 OUT SYS_REFCURSOR
,p_ref2 OUT SYS_REFCURSOR
)
AS
BEGIN
p_outstr := 'abc';
p_outint := '56789';
OPEN p_ref1 FOR SELECT ROWNUM*2 AS RN FROM DUAL CONNECT BY ROWNUM<=10;
OPEN p_ref2 FOR SELECT ROWNUM*2+1 AS RN FROM DUAL CONNECT BY ROWNUM<=10;
 
END sp_test;

/

过程已创建。
 

 

利用print客户端打印,sqlplus下:

Sql代码 
SET AUTOPRINT ON
VAR p_outstr VARCHAR2(10);
VAR p_outint NUMBER;
VAR p_ref1 REFCURSOR;
VAR p_ref2 REFCURSOR;

SET AUTOPRINT ON
VAR p_outstr VARCHAR2(10);
VAR p_outint NUMBER;
VAR p_ref1 REFCURSOR;
VAR p_ref2 REFCURSOR;
 

Sql代码 
scott@ORCL>EXEC sp_test(:p_outstr,:p_outint,:p_ref1,:p_ref2);
  
PL/SQL 过程已成功完成。
  
  
RN
----------
3
5
7
9
11
13
15
17
19
21
23
  
已选择11行。
  
  
RN
----------
2
4
6
8
10
12
14
16
18
20
22
  
已选择11行。
  
  
P_OUTINT
----------
56789
  
  
P_OUTSTR
--------------------------------
abc

scott@ORCL>EXEC sp_test(:p_outstr,:p_outint,:p_ref1,:p_ref2);

PL/SQL 过程已成功完成。


RN
----------
3
5
7
9
11
13
15
17
19
21
23

已选择11行。


RN
----------
2
4
6
8
10
12
14
16
18
20
22

已选择11行。


P_OUTINT
----------
56789


P_OUTSTR
--------------------------------
abc 也可以在声明输入输出变量之后,依次print p_outstr,...........

------解决方案--------------------
探讨
自已写出来了,呵呵
create or replace function c_re(v_deptno in emp.deptno%typ