查看: 1654|回复: 9

请教:如何写这条语句?

[复制链接]
跳转到指定楼层
1#
发表于 2006-7-17 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用存储过程,输入部门号,要求取得这个部门所有员工的姓名varchar(10),年龄number。
请问下该怎么写?
论坛徽章:
0
2#
发表于 2006-7-17 13:42 | 只看该作者
select 姓名 into xm,年齡 into nl from table where 部門號='xxxxx'

使用道具 举报

回复
3#
 楼主| 发表于 2006-7-17 15:09 | 只看该作者
一个部门不会只有一个人啊,select 出来的是一个结果集,包含多条数据,你这样是错误的吧,是不是要使用游标的?

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34会员2007贡献徽章
日期:2007-09-26 18:42:10BLOG每日发帖之星
日期:2009-11-18 01:01:072010新春纪念徽章
日期:2010-03-01 11:19:07
4#
发表于 2006-7-17 15:28 | 只看该作者
使用游标for 循环

使用道具 举报

回复
5#
 楼主| 发表于 2006-7-17 15:32 | 只看该作者
但是题目指明了用存储过程啊,怎么写的?

使用道具 举报

回复
论坛徽章:
90
生肖徽章:蛇
日期:2006-09-07 17:09:082011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:34现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:50:442012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09
6#
发表于 2006-7-17 16:17 | 只看该作者
返回的类型是什么? 自定义type还是cursor

使用道具 举报

回复
7#
 楼主| 发表于 2006-7-17 16:22 | 只看该作者
返回的是cursor,麻烦写得详细点哈,

使用道具 举报

回复
论坛徽章:
90
生肖徽章:蛇
日期:2006-09-07 17:09:082011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:34现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:50:442012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09
8#
发表于 2006-7-17 16:40 | 只看该作者
提供几种返回结果集的方法

创建示例表
[php]
create table tb_test
as
select cast(level as number(4)) as id,
       cast(dbms_random.string('u', 8) as char(8)) as val
  from dual
connect by level<5;

SQL> select * from tb_test;

        ID VAL
---------- --------
         1 JGSLQQQY
         2 BLIAELER
         3 WSXAJVHQ
         4 FLTGINNS

4 rows selected

-------------
[/php]


创建返回结果集的示例package pkg_getRecords
[php]
CREATE OR REPLACE PACKAGE pkg_getRecords
IS
  TYPE tCur IS REF CURSOR;
  TYPE tRec1 IS table of tb_test%rowtype;
  TYPE tRec2 IS table of tb_test%rowtype INDEX BY BINARY_INTEGER;
  function f_GetCursor return tCur;
  function f_GetRecord1 return tRec1;
  function f_GetRecord2 return tRec2;
  procedure p_GetRecords(pCur out tCur, pRec1 out tRec1, pRec2 out tRec2);
END pkg_getRecords;
/

CREATE OR REPLACE PACKAGE BODY pkg_getRecords
IS

FUNCTION f_GetCursor RETURN tCur
IS
  cur tCur;
BEGIN
  OPEN cur FOR
    SELECT * FROM tb_test;
  RETURN cur;
END;

FUNCTION f_GetRecord1 RETURN tRec1
IS
  rec1 tRec1 := tRec1();
BEGIN
  EXECUTE IMMEDIATE 'SELECT * FROM tb_test'
    bulk collect into rec1;
  RETURN rec1;
END;

FUNCTION f_GetRecord2 RETURN tRec2
IS
  rec2 tRec2;
BEGIN
  EXECUTE IMMEDIATE 'SELECT * FROM tb_test'
    bulk collect into rec2;
  RETURN rec2;
END;

PROCEDURE p_GetRecords(pCur out tCur, pRec1 out tRec1, pRec2 out tRec2)
AS
BEGIN
  OPEN pCur FOR
    SELECT * FROM tb_test;

  EXECUTE IMMEDIATE 'SELECT * FROM tb_test'
    bulk collect into pRec1;

  EXECUTE IMMEDIATE 'SELECT * FROM tb_test'
    bulk collect into pRec2;
  
END;

END pkg_getRecords;
/

-----------
[/php]

上面创建完所需的table和package, 下面看看package中function和procedure的调用和返回的结果集(提示: procedure中有三个out参数, 都是结果集)
[php]
SQL> set serveroutput on
SQL>
SQL>
SQL> declare
  2    cur  pkg_getRecords.tCur;
  3    vrow tb_test%rowtype;
  4    rec1 pkg_getRecords.tRec1;
  5    rec2 pkg_getRecords.tRec2;
  6  begin
  7    cur := pkg_getRecords.f_GetCursor;
  8  
  9    dbms_output.put_line('Output data of the cursor...');
10    LOOP
11      fetch cur into vrow;
12      EXIT WHEN cur%NOTFOUND;
13      dbms_output.put_line('id='||vrow.id||' & val='||vrow.val);
14    END LOOP;
15  
16    rec1 := pkg_getRecords.f_GetRecord1;
17  
18    dbms_output.put_line('Output data of the record1...');
19    for i in 1..rec1.count loop
20      dbms_output.put_line('id='||rec1(i).id||' & val='||rec1(i).val);
21    end loop;
22  
23    rec2 := pkg_getRecords.f_GetRecord2;
24  
25    dbms_output.put_line('Output data of the record2...');
26    for i in 1..rec1.count loop
27      dbms_output.put_line('id='||rec2(i).id||' & val='||rec2(i).val);
28    end loop;
29  
30    -- execute procedure p_GetRecords to get cur, rec1 & rec2
31    pkg_getRecords.p_GetRecords(cur, rec1, rec2);
32  
33    dbms_output.put_line('Output data of the cursor...');
34    LOOP
35      fetch cur into vrow;
36      EXIT WHEN cur%NOTFOUND;
37      dbms_output.put_line('id='||vrow.id||' & val='||vrow.val);
38    END LOOP;
39  
40    dbms_output.put_line('Output data of the record1...');
41    for i in 1..rec1.count loop
42      dbms_output.put_line('id='||rec1(i).id||' & val='||rec1(i).val);
43    end loop;
44  
45    dbms_output.put_line('Output data of the record2...');
46    for i in 1..rec1.count loop
47      dbms_output.put_line('id='||rec2(i).id||' & val='||rec2(i).val);
48    end loop;
49  
50  end;
51  /
Output data of the cursor...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS
Output data of the record1...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS
Output data of the record2...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS
Output data of the cursor...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS
Output data of the record1...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS
Output data of the record2...
id=1 & val=JGSLQQQY
id=2 & val=BLIAELER
id=3 & val=WSXAJVHQ
id=4 & val=FLTGINNS

PL/SQL procedure successfully completed

-----------
[/php]

使用道具 举报

回复
9#
 楼主| 发表于 2006-7-17 16:46 | 只看该作者
谢了载研究

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2006-7-19 13:33 | 只看该作者

Re: 请教:如何写这条语句?

最初由 下沙の山地之王 发布
[B]使用存储过程,输入部门号,要求取得这个部门所有员工的姓名varchar(10),年龄number。
请问下该怎么写? [/B]

create or replace procedure pp(a varchar2)
as
name2 varchar2(20);
type name1 is ref cursor;
name11 name1;
y varchar2(100);
begin
   y:='select name from dep where d_id='||chr(39)||a||chr(39);
   open name11 for y;
   --dbms_output.put_line(y);
   fetch name11 into name2;
   while name11%found
   loop
   exit when name11%notfound;
   dbms_output.put_line(name2);
   fetch name11 into name2;
   end loop;
   close name11;
end;
输入部门号a得到该部门员工的姓名。
使用函数:
create or replace function fun(a varchar2) return varchar2
as
begin
   for i in (select name from dep where d_id=a) loop
      dbms_output.put_line(i.name);
   end loop;
return 'ok';
end;
测试
select fun('1001') from dual;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表