/*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实现的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  10. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

随机推荐

  1. Win7系统与它的Virtualbox中安装的Ubuntu14.04共享信息的几种方法

    虚拟机是每一个程序猿必备的工具.本文依据最新版VirtualBox用户手冊的提示,通过自己的亲自实践,给出了Win7系统与执行在当中的VirtualBox 5.0.2中的Ubuntu 14.04共享信 ...

  2. jsp 普通变量与jQuery变量之间的转换

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. Js日常笔记之this

    在javascript中自己创建构造函数时可以利用this来指向新创建的对象上.这样就可以避免函数中的this指向全局了,如下 var x = 2; function test(){ this.x = ...

  4. 把一个base64编码的图片绘制到canvas (canvas的图片在转成dataurl)

    把一个base64编码的图片绘制到canvas 需要引入jquery. <canvas id="myCanvas" width="800" height= ...

  5. win 7 下vim的使用

    1.gVim74.exe ftp://ftp.vim.org/pub/vim/pc/gvim74.exe 2.vimcdoc-1.9.0-setup.exe 中文说明文档 http://211.147 ...

  6. 【Shader】人物选中高亮状态

    Shader "OutLine/RedOutLine" { Properties { _Switch("Value",Range(0,1)) = 0 _Main ...

  7. atitit.  web组件化原理与设计

    atitit.  web组件化原理与设计 1. Web Components提供了一种组件化的推荐方式,具体来说,就是:1 2. 组件化的本质目的并不一定是要为了可复用,而是提升可维护性. 不具有复用 ...

  8. [svc]linux常用手头命令-md版-2017年11月12日 12:31:56

    相关代码 curl命令-网站如果3次不是200或301则报警 curl -o /dev/null -s -w "%{http_code}" baidu.com -k/--insec ...

  9. iOS开发之使用XMPPFramework实现即时通信

    iOS开发之使用XMPPFramework实现即时通信   关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让 ...

  10. PHP学习笔记(4)GD库画五角星

         <?php //加header头,不然浏览器乱码 header("content-type: image/png"); //创建画布资源 $img = imagec ...