该函数功能是这样的:当输入一个部门编号时,输出该部门的员工的所有信息。(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,...........
------解决方案--------------------