oracle 结果集建表,Oracle通过调用函数返回一个查询的结果集

一.一般调用

1.创建一个Table

-- Create table

create table MASTER

(

ID   NVARCHAR2(10) not null,

NAME NVARCHAR2(100)

)

tablespace USERS

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

-- Create/Recreate primary, unique and foreign key constraints

alter table MASTER

add constraint PK_ID primary key (ID)

using index

tablespace USERS

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

2.创建Package以及函数

CREATE OR REPLACE PACKAGE pkg_test

AS

TYPE ReturnDataSet IS REF CURSOR;

FUNCTION get return pkg_test.ReturnDataSet;

END pkg_test;

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

FUNCTION get return pkg_test.ReturnDataSet

IS

ACursor pkg_test.ReturnDataSet;

BEGIN

OPEN ACursor FOR

SELECT ID, NAME

FROM MASTER;

return ACursor;

END get;

END pkg_test;

3.在pl/sql Developer中调用

select pkg_test.get()from dual

二.在此基础上进一步扩展一下,实现交叉表的形式

除了MASTER表之外,再创建一个Business表

MASTER表的ID字段与Business表的MasterID字段相关联

-- Create table

create table BUSINESS

(

ID       NVARCHAR2(10) not null,

NAME     NVARCHAR2(200),

MASTERID NVARCHAR2(10) not null,

COUNT    INTEGER

)

tablespace USERS

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

-- Create/Recreate primary, unique and foreign key constraints

alter table BUSINESS

add constraint PK_BUSINESS_ID primary key (ID, MASTERID)

using index

tablespace USERS

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

添加数据后

Master表中数据为

ID        Name

001       一番

002       二番

003       三番

Bussiness表中数据为

ID            NAME         MASTERID        COUNT

10000001      佐藤          001              200

10000001      佐藤          002               10

10000001      佐藤          003               15

10000002      村上          001              100

10000002      村上          002               12

10000003      飛鳥桜        001               50

10000003      飛鳥桜        003               66

通过查询数据库,想实现以下效果

ID            NAME       一番     二番      三番

10000001      佐藤        200     10        15

10000002      村上        100     12

10000003      飛鳥桜       50                66

步骤

1:创建package(同上)

CREATE OR REPLACE PACKAGE pkg_test

AS

TYPE ReturnDataSet IS REF CURSOR;

FUNCTION get return pkg_test.ReturnDataSet;

END pkg_test;

2:创建package body

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

FUNCTION get return pkg_test.ReturnDataSet

IS

ACursor pkg_test.ReturnDataSet;

STRSQL VARCHAR2(4000);

v_ID MASTER.ID%TYPE;

v_NAME MASTER.NAME%TYPE;

CURSOR cur is SELECT ID, NAME FROM MASTER;

BEGIN

STRSQL:='SELECT a.ID, a.NAME,';

/*for v in cur loop

STRSQL:=STRSQL || 'SUM(DECODE(MasterID,''' || v.id ||''',Count,''''))  ' || v.name ||',';

end loop;*/

OPEN cur;

LOOP

FETCH cur INTO v_ID,v_NAME;

EXIT WHEN cur%NOTFOUND;

STRSQL:=STRSQL || 'SUM(DECODE(MasterID,''' || v_ID ||''',Count,''''))  ' || v_NAME ||',';

END LOOP;

CLOSE cur;

STRSQL:=substr(STRSQL,0,length(STRSQL)-1);

STRSQL:=STRSQL ||'  from Business a  group by a.ID,a.Name';

DBMS_OUTPUT.put_line(STRSQL);

OPEN ACursor FOR

STRSQL;

return ACursor;

END get;

END pkg_test;

3:进行调试输出,即可得到想要的结果

SELECT PKG_TEST.get() FROM DUAL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值