任何人都可以帮我解决这个问题。
我需要编写一个pl / sql查询,它将来自emp的deptno作为输入并返回ename,sal以及dept表中的所有列。(我不想单独声明列,而是我想使用%行类型)。
我已经尝试过几种方式。其中一个在下面提到。 创造 -
CREATE OR REPLACE PROCEDURE PROC01(
DNO EMP.DEPTNO%TYPE,
REC OUT DEPT%ROWTYPE,
NAME OUT EMP.ENAME%TYPE,
SAL OUT EMP.SAL%TYPE
, MY_CURSOR OUT SYS_REFCURSOR)
IS
BEGIN
OPEN MY_CURSOR FOR
SELECT D.*, ENAME, SAL
FROM EMP, DEPT D
WHERE EMP.DEPTNO = D.DEPTNO
AND D.DEPTNO = DNO;
END PROC01;
/
--Declare & Execution
DECLARE
REC DEPT%ROWTYPE;
NAME EMP.ENAME%TYPE;
SAL EMP.SAL%TYPE;
MY_CURSOR SYS_REFCURSOR;
BEGIN
PROC01(&DNO,REC, NAME, SAL, MY_CURSOR);
LOOP
FETCH MY_CURSOR INTO REC, NAME, SAL;
EXIT WHEN MY_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(REC.DNAME||' '||NAME||' '||SAL);
END LOOP;
CLOSE MY_CURSOR;
END;
/
错误: - INTO列表中的表达式“REC”类型错误 提前谢谢......
答案 0 :(得分:0)
错误是因为oracle无法同时在rec类型和普通类型中获取游标。 我改变了你的查询,它现在正在运作!
程序:
CREATE OR REPLACE PROCEDURE PROC01(DNO IN emp.deptno%TYPE,
/*REC OUT DEPT%ROWTYPE,
NAME OUT EMP.ENAME%TYPE,
SAL OUT EMP.SAL%TYPE,*/
MY_CURSOR OUT SYS_REFCURSOR) IS
BEGIN
OPEN MY_CURSOR FOR
SELECT D.*, ENAME, SAL
FROM EMP, DEPT D
WHERE EMP.DEPTNO = D.DEPTNO
AND D.DEPTNO = DNO;
END PROC01;
测试代码:
DECLARE
REC DEPT%ROWTYPE;
DEPTNO DEPT.deptno%TYPE;
DNAME DEPT.dname%TYPE;
LOC DEPT.loc%TYPE;
NAME EMP.ENAME%TYPE;
SAL EMP.SAL%TYPE;
MY_CURSOR SYS_REFCURSOR;
BEGIN
PROC01(&DNO, /*REC, NAME, SAL,*/ MY_CURSOR);
LOOP
FETCH MY_CURSOR
INTO /*REC*/ DEPTNO, DNAME, LOC, NAME, SAL;
EXIT WHEN MY_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( /*REC.*/ DNAME || ' ' || NAME || ' ' || SAL);
END LOOP;
CLOSE MY_CURSOR;
END;