帮忙写个oracle 存储过程,可以返回表的所有列的结果集
3个回答
展开全部
与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;
(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;
展开全部
create or replace procedure select_li (
table_name varchar2(30)
)
is
begin
select * from table_name where 1=2
end
(这个是只有列值,选出来的结果里边没有数据,想要数据就把1=2去掉)
table_name varchar2(30)
)
is
begin
select * from table_name where 1=2
end
(这个是只有列值,选出来的结果里边没有数据,想要数据就把1=2去掉)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询