我们可以对连接条件的两个表使用%rowtype吗?

时间:2017-07-26 12:01:18

标签: sql oracle plsql

1.dept(父表)    -deptno dname loc

2.emp(子表)     -empno ename sal deptno

*显示ename,loc,同时我们使用%rowtype给出empno。

*使用这个plsql程序来实现结果。

DECLARE 
v1 emp%rowtype;
v2 dept1%rowtype;
vnum emp.empno%type:='&no';
BEGIN
SELECT A.ename,b.loc
INTO v1,v2
FROM emp A,dept1 b
WHERE A.deptno=b.deptno AND A.empno=vnum;
dbms_output.put_line(v1.ename||'**'||v2.loc);
end;

2 个答案:

答案 0 :(得分:0)

如果您选择的所有内容都是单列,为什么要使用rowtype? 您可以使用列类型声明变量。

DECLARE
v1 emp.ename%type;
v2 dept1.loc%type;
vnum emp.empno%type:='&no';
BEGIN
    SELECT A.ename,
        b.loc
    INTO v1,
        v2
    FROM emp A,
        dept1 b
    WHERE A.deptno=b.deptno
    AND A.empno   =vnum;
    dbms_output.put_line(v1.ename||'**'||v2.loc);
END;

答案 1 :(得分:0)

我们可以定义一个定制的记录类型,以匹配PL / SQL中特定查询的投影。这样做的一个优点是能够从记录类型定义表类型,这对于获取多个记录很方便。

DECLARE 
   type v_rec_t is record (
      ename emp.ename%type
      , loc dept1.loc%type
      );
   l_rec v_rec_t;

   type v_rec_nt is table of  v_rec_t;
   l_recs v_rec_nt;  

BEGIN

  SELECT A.ename, b.loc
  INTO l_rec
  FROM emp A, dept1 b 
  WHERE A.deptno = b.deptno 
  AND A.empno = &empno;

  dbms_output.put_line(l_rec.ename ||'**'|| l_rec.loc);

  -- get multiple rows
  SELECT A.ename, b.loc
  bulk collect INTO l_recs
  FROM emp A
       join dept1 b 
      on A.deptno = b.deptno 
  where A.deptno = &deptno;


  dbms_output.put_line(' emps in dept'|| l_recs.count());

end;

定义显式游标的原因之一是我们可以根据它们的预测定义记录变量:

declare
    cursor c_emploc (p_empid emp.empno%type) is
         SELECT A.ename, b.loc
         FROM emp A, dept1 b 
         WHERE A.deptno = b.deptno 
         AND A.empno = p_empid;
  r_emploc c_emploc%rowtype;
  ....