帮忙写个oracle 存储过程,可以返回表的所有列的结果集

 我来答
老冯文库
2011-03-29 · 知道合伙人软件行家
老冯文库
知道合伙人软件行家
采纳数:1139 获赞数:8734

向TA提问 私信TA
展开全部
与SQL Server的存储过程和函数均可以返回结果集不同的是,PL/SQL的存储过程和函数均不直接提供返回数据集的方法,但可以通过返回类型对象来实现返回数据集的效果。具体思路为:
(1)创建包头,在其中声明类型和存储过程,类型应该引用游标;
(2)创建包体,定义存储过程,执行查询,将查询得到的结果集以游标句柄的形式返回。
说明:游标分为显示游标和隐式游标,任何查询结果默认都提供隐式游标,当前方案的重点在于使用游标取得查询结果的句柄,由于游标被引用为类型,通过返回类型,即等效于(并不等同)返回数据集。

具体的案例如下:
--创建包头
create or replace package mypackage1
as
--声明类型,并引用游标
type cursorType is ref cursor;
--声明存储过程,两个输入参数,一个输出参数,输出游标类型数据
procedure prcGetGlobalAddress
(
cur in out mypackage1.cursorType --输出参数,数据类型为引用游标的类型
);
end mypackage1;

--创建包体
create or replace package body mypackage1
as
--定义存储过程
procedure prcGetGlobalAddress
(
cur in out mypackage1.cursorType
)
as
begin
--返回得到分页查询结果集的游标句柄
open cur for
select * from mytable;
end prcGetGlobalAddress;

end mypackage1;
追问
麻烦你写个完整的行吗
追答
已知学生表的创建和数据添加如下:
create table student
(
sid int primary key,
sname nvarchar2(20),
gender char(2),
birth date
);

insert into student values(1001,'张三其','男','3-2月-1990');
insert into student values(1002,'李师煊','女','9-12月-1985');
insert into student values(1003,'王五','男','30-6月-1988');
commit;
--(1)创建包头
create or replace package mypackage3
as
type mycur is ref cursor;

procedure prcGetStudentInfoByID
(
stuid student.SID%type,
rs out mypackage3.mycur
);
end mypackage3;

--(2)创建包体
create or replace package body mypackage3
as
procedure prcGetStudentInfoByID
(
stuid student.SID%type,
rs out mypackage3.mycur
)
as
begin
open rs for
select * from student where sid = stuid;
end prcGetStudentInfoByID;
end mypackage3;

--(3)执行存储过程
declare
rs mypackage3.mycur;
sid student.SID%type;
sname student.sname%type;
gender student.GENDER%type;
birth student.BIRTH%type;
begin
mypackage3.prcGetStudentInfoByID(1100, rs);
fetch rs into sid,sname,gender,birth;
while rs%found loop
dbms_output.put_line(sid || ' ' || sname || ' ' || gender || ' ' || birth);
fetch rs into sid,sname,gender,birth;
end loop;
end;
SRE
推荐于2016-01-21 · TA获得超过1024个赞
知道小有建树答主
回答量:250
采纳率:33%
帮助的人:108万
展开全部
create or replace procedure select_li (
table_name varchar2(30)
)
is
begin
select * from table_name where 1=2
end
(这个是只有列值,选出来的结果里边没有数据,想要数据就把1=2去掉)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chonglangshou1
2011-03-31 · TA获得超过118个赞
知道小有建树答主
回答量:159
采纳率:50%
帮助的人:102万
展开全部
SQL> --表ccj 字段类型
SQL> desc ccj;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
Q NUMBER(5) Y
J VARCHAR2(10) Y

SQL> --表ccj数据
SQL> SELECT *
2 FROM CCJ;

Q J
------ ----------
5 A
6 B

SQL> --创建过程SY
SQL> CREATE OR REPLACE PROCEDURE SY
2 AS
3 a ccj.q%type;
4 b ccj.j%type;
5 --定义游标CU
6 CURSOR cu IS
7 SELECT q,j
8 FROM CCJ;
9 ----执行
10 BEGIN
11 --打开游标
12 OPEN cu;
13 --执行游标
14
15 LOOP
16 FETCH cu INTO a,b;
17 EXIT WHEN cu%NOTFOUND;
18 DBMS_OUTPUT.put_line(a||' '||b);
19 END LOOP;
20 --结束游标
21 CLOSE cu;
22 ----结束
23 END;
24 /

Procedure created
--执行
SQL> EXECUTE SY;

5 A
6 B
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式