Oracle pl/sql查询,它以emp中的deptno作为输入,并返回dept表中的ename、sal所有列
谁能帮我解决这个问题 我需要编写一个pl/sql查询,该查询将emp中的deptno作为输入,并返回ename、sal以及dept表中的所有列。我不想单独声明这些列,而是希望使用%rowtype 我试过几种方法。下面提到其中之一。 创作-Oracle pl/sql查询,它以emp中的deptno作为输入,并返回dept表中的ename、sal所有列,oracle,stored-procedures,procedures,cursors,rowtype,Oracle,Stored Procedures,Procedures,Cursors,Rowtype,谁能帮我解决这个问题 我需要编写一个pl/sql查询,该查询将emp中的deptno作为输入,并返回ename、sal以及dept表中的所有列。我不想单独声明这些列,而是希望使用%rowtype 我试过几种方法。下面提到其中之一。 创作- CREATE OR REPLACE PROCEDURE PROC01( DNO EMP.DEPTNO%TYPE, REC OUT DEPT%ROWTYPE, NAME OUT EMP.ENAME%TYPE,
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”类型错误
提前感谢…错误是因为oracle无法同时获取rec类型和normal类型中的游标。 我更改了你的查询,它现在正在工作 程序:
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;
那么,您在使用这种方法时遇到的问题是什么呢?非常感谢Ramin提供的解决方案。但是,如果dept表有20列,我必须打印所有列而不声明每个列,那么该怎么办呢?您必须为所有20列创建一个行类型,然后在一个行类型中获取它。关键是不能同时使用行类型和普通类型。下面是创建类型的示例:创建或替换类型full\u mailing\u address\u type为OBJECT Street VARCHAR280、City VARCHAR280、State CHAR2、Zip VARCHAR210;我们可以使用2种行类型吗??我的意思是REC dept%rowtype,REC emp%rowtype在程序创建中??并像declare REC DEPT%ROWTYPE一样声明它们;REC1 EMP%行类型;我的光标系统参考光标;把我的光标移到rec,rec1不,我不这么认为。