在上个例子中,我们演示了通过java调用存储过程,获取数据集.可能有人觉得这个调用有点麻烦,本文又演示多个例子.
示范: "select * from table(wilent_group_count1)";
其中wilent_group_count1为oracle函数,返回一个用户所需的虚拟表,再通过table()函数转换成表.
步骤:
一. 数据库表:
sql 代码
-
- create table wilent_user(
- id number(5) primary key,
- name varchar2(100),
- sex varchar2(1),
- group_id number(5),
- teach varchar2(50)
- );
-
-
- create table wilent_group(
- id number(5) primary key,
- name varchar2(100)
- );
-
- insert into wilent_group values(1,'组1');
- insert into wilent_group values(2,'组2');
- insert into wilent_group values(3,'组3');
- insert into wilent_group values(4,'组4');
- insert into wilent_group values(5,'组5');
-
- insert into wilent_user values(1,'吴','Y',1,'大专');
- insert into wilent_user values(2,'李','Y',1,'大专');
- insert into wilent_user values(3,'赵','N',2,'本科');
- insert into wilent_user values(4,'金','Y',2,'高中');
- insert into wilent_user values(5,'钱','N',2,'大专');
- insert into wilent_user values(6,'孙','N',1,'大专');
- insert into wilent_user values(7,'高','Y',3,'本科');
- insert into wilent_user values(8,'宋','N',3,'高中');
- insert into wilent_user values(9,'伍','Y',3,'大专');
- insert into wilent_user values(10,'欧','Y',4,'本科');
- insert into wilent_user values(11,'庄','N',4,'硕士');
- insert into wilent_user values(12,'纪','Y',4,'本科');
- insert into wilent_user values(13,'陈','Y',5,'大专');
- insert into wilent_user values(14,'龙','N',5,'大专');
- insert into wilent_user values(15,'袁','Y',5,'高中');
- insert into wilent_user values(16,'杨','Y',1,'本科');
- insert into wilent_user values(17,'江','N',1,'大专');
- insert into wilent_user values(18,'刘','Y',1,'硕士');
- insert into wilent_user values(19,'郭','N',3,'硕士');
- insert into wilent_user values(20,'张','Y',3,'大专');
- insert into wilent_user values(21,'文','N',3,'硕士');
- insert into wilent_user values(22,'李','N',4,'大专');
- insert into wilent_user values(23,'梅','Y',4,'本科');
- insert into wilent_user values(24,'王','N',4,'大专');
- insert into wilent_user values(25,'吕','N',5,'高中');
- insert into wilent_user values(26,'范','Y',5,'本科');
- insert into wilent_user values(27,'许','N',1,'大专');
- insert into wilent_user values(28,'墨','Y',1,'高中');
- insert into wilent_user values(29,'孔','N',1,'本科');
- insert into wilent_user values(30,'蔡','Y',1,'大专');
二. oracle 函数
1. 返回虚拟表结构.
sql 代码
- --自定义一种类型;
- Create Or Replace Type wilent_row_table As Object
- (
- group_name Varchar2(100),
- group_count Number(4),
- male_count Number(4),
- woman_count Number(4),
- da_count Number(4),
- ben_count Number(4)
- );
2. 虚拟表类型.
sql 代码
- --定义一种嵌套类型;
- Create Or Replace Type wilent_tab_type Is Table Of wilent_row_table;
3. oracle 函数
sql 代码
- Create Or Replace Function wilent_group_count1
- Return wilent_tab_type
- As
- v_tab wilent_tab_type := wilent_tab_type();
- index_max Number(4);
- index_min Number(4);
- index_for Number(4);
-
- group_name Varchar2(100);
- user_count Number(4);
- male_count Number(4);
- woman_count Number(4);
- da_count Number(4);
- ben_count Number(4);
- Begin
- Select Max(g.Id) Into index_max From wilent_group g;
-
- Select Min(g.Id) Into index_min From wilent_group g;
-
- For index_for In Index_min..index_max Loop
-
- v_tab.Extend;
- Select Name Into group_name From wilent_group Where Id=index_for;
- Select Count(*) Into user_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for;
- Select Count(*) Into male_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And sex='Y';
- Select Count(*) Into woman_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And sex='N';
- Select Count(*) Into da_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And teach='大专';
- Select Count(*) Into ben_count From wilent_user u, wilent_group g Where u.group_id=g.Id And g.Id=index_for And teach='本科';
-
- v_tab(v_tab.Last) := wilent_row_table(group_name,user_count,male_count,woman_count,da_count,ben_count);
- End Loop;
-
- Return v_tab;
- End;
三.测试
1. 测试sql
sql 代码
- select * from table(wilent_group_count1);
2. 测试结果
sql 代码
- GROUP_NAME GROUP_COUNT MALE_COUNT WOMAN_COUNT DA_COUNT BEN_COUNT
- 组1 10 6 4 6 2
- 组2 3 1 2 1 1
- 组3 6 3 3 2 1
- 组4 6 3 3 2 3
- 组5 5 3 2 2 1
分享到:
相关推荐
### Oracle8i_9i数据库基础 #### 一、Oracle SQL*PLUS基础 **1.1 关系数据库系统(RDBMS)理解** - **关系模型:** 关系数据库是基于关系模型的数据组织方式,该模型由埃德加·科德(Edgar F. Codd)提出。它通过...
在Oracle中,`dual` 是一个特殊表,用于简单的查询,如这个例子中的字符串长度查询。 #### 6. 求最大值的函数 - **题目:** 以下那条语句是求最大值? - **答案:** A (`SELECT MAX(book_price) FROM tb_book`) - **...
**解答:** Oracle分页查询可以通过`ROWNUM`函数实现: ```sql SELECT * FROM ( SELECT t.*, ROWNUM rnum FROM ( SELECT * FROM table_name ORDER BY column_name ) t WHERE ROWNUM ) WHERE rnum > start_row...
Oracle数据库提供了多种方法来实现字段级别的去重。 #### 二、去重需求分析 根据提供的描述“oracle字段去重 以某一个字段去重”,可以理解为在某个表中基于特定字段进行去重处理。这里的关键在于如何有效地针对...
### Oracle基础教程:第8章_存储过程、函数和包 #### 一、存储过程与函数概述 在Oracle数据库管理中,存储过程和函数是非常重要的组成部分。这些对象可以帮助开发人员和数据库管理员更有效地管理和操作数据库。 *...
### Oracle存储过程、函数语法详解 #### 一、概述 Oracle数据库系统因其高效的数据处理能力,在企业级应用中被广泛采用。存储过程和函数作为Oracle数据库的重要组成部分,可以帮助开发人员编写更加灵活、高效的...
- **占用存储空间**:索引本身也需要存储空间。 - **影响插入/更新/删除操作的性能**:每次数据发生变化时,索引也需要更新,这会降低数据维护的速度。 - **不合理使用索引的例子**: - 不应在索引字段上执行...
5. **INSTR函数**:`SELECT INSTR('oracle traning', 'ra', 1, 2) instring FROM DUAL;` - 在一个字符串中搜索指定的子串并返回其位置。 6. **LENGTH函数**:`SELECT NAME, LENGTH(NAME), ADDR, LENGTH(ADDR), SAL,...
- 存储过程和函数的文本通过`SELECT text FROM user_source WHERE name='BOOK_SP_EXAMPLE';`查询。 - 如果建立时出现错误,可以使用`SELECT * FROM user_errors;`查看错误信息。 以上是Oracle数据库的一些基础...
- **从另外一个表复制**:通过 `INSERT INTO table1 SELECT * FROM table2;` 来复制数据。 - **在INSERT语句中使用子查询**:可以从子查询的结果集中插入数据。 - **UPDATE更新数据的语法**:用于修改现有行的数据...
4. **定义Hibernate Native SQL查询**:由于Hibernate默认不支持调用存储过程或函数,我们需要使用`@NamedNativeQuery`或`@SqlResultSetMapping`注解来定义一个原生SQL查询,用于调用Oracle函数。例如: ```java @...
- **例子**: ```sql UPDATE warehouses SET warehouse_spec = APPENDCHILDXML(warehouse_spec, '/Warehouse/Building', XMLType('<Owner>Grandco</Owner>')) WHERE EXTRACTVALUE(warehouse_spec, '/Warehouse/...
3. **结束标志**:通过一个空的`RETURN`语句表示函数处理完成。 4. **实时性**:适用于需要实时反馈处理进度或数据流的应用场景。 #### 三、创建步骤 ##### 1. 创建类型对象 在创建管道函数之前,首先需要定义一...
- **使用汇总函数**:例如计算某个集合的最大值或最小值。 - **嵌套子查询**:子查询中又包含另一个子查询。 - **相关子查询**:子查询引用外部查询中的一个或多个列。 - **EXISTS、ANY、ALL**:用于更复杂的...
- **你的第一个查询**:通过一个简单的例子来展示如何执行SELECT查询。 - **总结**:回顾了SELECT语句的基础语法和使用场景。 #### 第三天:表达式、条件语句与运算 - **表达式**:用于组合SQL元素(如列名、变量、...
- **你的第一个查询**:通过简单的例子介绍如何编写基本的SELECT语句,例如从特定表中选择所有记录或特定列的记录。 - **总结**:强调SELECT语句的基础性和重要性,以及其在日常数据库管理工作中的应用。 #### 第三...
- **Windows NT 和 Windows 2000 环境**: 通过 Oracle 的客户端工具访问 SQL*PLUS。 **1.5 常用 SQL*PLUS 附加命令简介** - **DESCRIBE**: 显示表或视图的结构。 - **LIST**: 列出当前 SQL 缓冲区的内容。 - **...