map实现
/*PLSQL实现Map*/
--建立序列
create sequence seq_map_param_id ;
--建立参数表
create table map_param(id number primary key , tname varchar2(30)) ;
--初始化
insert into map_param values (seq_map_param_id.nextval , 'EMP') ;
insert into map_param values (seq_map_param_id.nextval , 'DEPT') ;
CREATE OR REPLACE PACKAGE BODY utl_map_2 is
PROCEDURE output_map (p_in_tname VARCHAR2,p_in_idx_col_name VARCHAR2 DEFAULT '') IS
tb_count number ;
l_col_type user_tab_cols.DATA_TYPE%type;
main_sql varchar2(32767);
BEGIN
--各种判断
--表是否存在
select count(*) into tb_count from user_tables where table_name=p_in_tname ;
if tb_count = 0 then
raise_application_error(-20999,'Table not found') ;
end if ;
--列是否存在,map key column类型是否正确
begin
select data_type into l_col_type
from user_tab_cols col
where col.TABLE_NAME=p_in_tname
and col.COLUMN_NAME=p_in_idx_col_name ;
if l_col_type not in ('VARCHAR2') then
raise_application_error(-20999,'idx column only varchar2');
end if ;
exception
when no_data_found then
raise_application_error(-20999,'Column not found in table '||p_in_tname) ;
end ;
--example:declare cursor cur is select * from EMP ; begin for rec in cur loop utl_var_2.EMP_list(rec.ENAME) := rec ; end loop ; end;
main_sql := 'declare ' ||
'cursor cur is select * from '||p_in_tname||' ; ' ||
'begin ' ||
'for rec in cur loop ' ||
'utl_var_2.'||p_in_tname||'_list(rec.'||p_in_idx_col_name||') := rec ; '||
'end loop ; '||
'end;' ;
execute immediate main_sql ;
--dbms_output.put_line(main_sql) ;
END ;
PROCEDURE var_init is
pkg_dec_sql varchar2(32767) ;
CURSOR param_cur is select * from map_param ;
begin
pkg_dec_sql := 'create or replace package utl_var_2 is ' ;
for rec in param_cur loop
pkg_dec_sql := pkg_dec_sql || 'type t_'||rec.tname||' is table of '||rec.tname||'%rowtype index by varchar2(4000) ; '||
rec.tname||'_list t_'||rec.tname||' ; ' ;
end loop ;
/*
example :
create or replace package utl_var_2 is
type t_EMP is table of EMP%rowtype index by varchar2(4000);
EMP_list t_EMP;
type t_DEPT is table of DEPT%rowtype index by varchar2(4000);
DEPT_list t_DEPT;
end;
*/
pkg_dec_sql := pkg_dec_sql || ' end ; ';
execute immediate pkg_dec_sql ;
end var_init ;
END utl_map_2 ;
SQL> begin
2 utl_map_2.output_map(p_in_tname => 'DEPT', p_in_idx_col_name => 'LOC');
3 dbms_output.put_line('deptno : '||utl_var_2.dept_list('NEW YORK').deptno ||' loc : ' ||utl_var_2.dept_list('NEW YORK').loc ) ;
4 end ;
5 /
deptno : 10 loc : NEW YORK
PL/SQL procedure successfully completed
SQL> begin
2 utl_map_2.output_map(p_in_tname => 'EMP', p_in_idx_col_name => 'ENAME');
3 dbms_output.put_line('ename : '||utl_var_2.emp_list('SMITH').ename ||' job : ' ||utl_var_2.emp_list('SMITH').job ) ;
4 end ;
5 /
ename : SMITH job : CLERK
PL/SQL procedure successfully completed
不过每次配置后的时候需要手动重新执行以下初始化程序 utl_map_2.var_init
--map方法
MAP方法用于将对象实例映射为标量数值(number,date,varchar2等)。
对于相同对象类型不同对象实例来说,因为他们的数据类型是复合数据类型,所以对象实例之间不能直接进行比较。
为了排序多个对象实例的数据,可以在建立对象类型时定义MAP方法。
注意:一个对象类型最多只能定义一个MAP方法,并且MAP方法和ORDER方法不能同时使用。
CREATE OR REPLACE TYPE person_typ4 AS OBJECT
(
name VARCHAR2(10),
gender VARCHAR2(2),
birthdate DATE,
MAP MEMBER FUNCTION getage RETURN VARCHAR2
)
;
CREATE OR REPLACE TYPE BODY person_typ4 IS
MAP MEMBER FUNCTION getage RETURN VARCHAR2
IS
BEGIN
RETURN TRUNC((SYSDATE-birthdate)/365);
END;
END;
/
CREATE TABLE employee_tab4(
eno NUMBER(6),person person_typ4,
sal NUMBER(6,2),job VARCHAR2(10)
);
INSERT INTO employee_tab4(eno,sal,job,person)
VALUES(1,1500,'图书管理员',person_typ4('玛丽','女','11-1月-76'));
INSERT INTO employee_tab4(eno,sal,job,person)
VALUES(2,2000,'高级焊工',person_typ4('王明','男','11-5月-75'));
INSERT INTO employee_tab4(eno,sal,job,person)
VALUES(3,2500,'高级工程师',person_typ4('黎明','男','11-5月-70'));
DECLARE
TYPE person_table_type IS TABLE OF person_typ4;
person_table person_table_type;
v_temp VARCHAR2(100);
BEGIN
SELECT person BULK COLLECT INTO person_table
FROM employee_tab4;
IF person_table(1).getage()>person_table(2).getage() THEN
v_temp:=person_table(1).name||'比'||person_table(2).name||'大';
ELSE
v_temp:=person_table(1).name||'比'||person_table(2).name||'小';
END IF;
dbms_output.put_line(v_temp);
END;
map实现的更多相关文章
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- 多用多学之Java中的Set,List,Map
很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
随机推荐
- C++ String和其他类型互换
在C++中如何实现String和其他类型互换呢?最好的方式是使用stringstream,下面简单介绍下: 1.其他类型转换为String #include <sstream> strin ...
- webDriver API——第11部分Remote WebDriver
The WebDriver implementation. class selenium.webdriver.remote.webdriver.WebDriver(command_executor=' ...
- react 设置代理(proxy) 实现跨域请求
一,对于使用creat-react-app构建的项目,可以直接在package.json下配置,具体如下 "proxy": "http://api.xxxx.com&qu ...
- iOS UITableView表视图滚动隐藏UINavigationController导航栏
UITableView 继承于UIScrollView 所以UIScrollView 的代理方法相同适用于UITableView 中 隐藏导航栏的方法为: self.navigationControl ...
- vpngate 的使用
第一次为小日本打广告.. .我仅仅想仰天大喊..玛的戈壁. .. 竟然活到这个份上了...想出去看看的往下看.. vpngate 下载: http://pan.baidu.com/s/1hq5x3Ly ...
- DEV 第三方控件报表分类汇总
最近这段时间难得空闲,于是打算做个报表功能,主要实现数据的分类汇总,以便不时之需.首先看看效果: 主要是根据工程类型这个字段进行分类,每个分类下对应的项目金额进行求和,当然,你也可以根据实际需求,进行 ...
- 现在的C语言编辑器里的int范围为什么是-2147483648~2147483647 2014-08-05 10:21 100人阅读 评论(0) 收藏
下面是引用百度文库的一段话: "这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为111111111111111 ...
- 转:BOOTSTRAP 增加、关闭、折叠TAB代码下载
http://git.oschina.net/hbbcs/bootStrap-addTabs
- 静态资源打包:一个javescript 的src引用多个文件,一个link引用多个CSS文件
疑惑描述: 查看了淘宝网的首页源文件,看到这样的一个特殊的 <script src="http://a.tbcdn.cn/??s/kissy/1.1.6/kissy-min.js,p/ ...
- Unity编辑器下获取动画的根运动状态并修改
我最初想直接修改.anim文件 但通过后来得到的信息,其实根运动状态储存在FBX.meta文件里,转出的.anim文件虽然也有根运动的信息但是算是塌陷过的,无法进行开关操作. 这是我针对有根运动.an ...