`

存储过程学习 第11章

阅读更多
1byte=8bit
a char(32767 byte)
varchar2 4000byte
number(5,2) 999.99
number(3,-2)99900;
round trunc ceil floor
pls_integer(性能更好) 2**31
binary_integer 
positive
natural




-----------------------字符串测试
DECLARE
  c_str CHAR(3);
  str   VARCHAR2(10) not null:=''; 限制为非空
BEGIN
  c_str := 'abc';
  dbms_output.put_line('c_str=========' || c_str || '==============');
  c_str := 'a';  --占用3个位置
  dbms_output.put_line('c_str=========' || c_str || '==============');

  str := 'abc';  --变长
  dbms_output.put_line('str=========' || str || '==============');
  str := rpad('a', 5); --右填充
  dbms_output.put_line('str=========' || str || '==============');
  c_str := 'abcd';
EXCEPTION
  WHEN value_error THEN
    dbms_output.put_line('value error!');
END;

--------------------------record 测试
SELECT * FROM emp;

DECLARE
  TYPE emp_record IS RECORD(  --记录
    ename emp.ename%TYPE,
    job   emp.ename%TYPE);
  employee emp_record;

	type default_type is record(
		birthday date:=trunc(sysdate),
		age number(3):=0);
	
BEGIN
  SELECT ename, job INTO employee FROM emp WHERE empno = 7369;
  dbms_output.put_line('employee name:' || employee.ename ||
                       ' ,employee job:' || employee.job);
END;


------------------------------------

declare
	type my_emp_record is record( --嵌套
	id emp.empno%type,
	employee emp_pkg.emp_record);  
	mydata my_emp_record;
begin
	mydata.id:='7369';
	mydata.employee:=emp_pkg.empTool(mydata.id);
	dbms_output.put_line(mydata.employee.name);
end;

----------------------index by table (非约束索引 线性 稀疏表
记录和index-by表在包或过程中存储,不能作为对象存储
varray 可存储,索引是紧密 初始化 从1 开始 定长

declare
	type table_type is table of emp_pkg.emp_record index by binary_integer;
	tab table_type;
	emp_id emp.empno%type:=7369;
	location binary_integer;
begin
	location:=emp_id;
	tab(location):=emp_pkg.empTool(emp_id);
	dbms_output.put_line(tab(location).name);
	dbms_output.put_line(tab(location).job);
	dbms_output.put_line('d'||tab(location+1).name);

	dbms_output.put_line(tab(location).job);
	exception when others then
		dbms_output.put_line('at '||location||' cannot find data!');
end;

---------------------找到存在的值
declare
	type table_type is table of integer index by binary_integer;
	tab table_type;
begin
	tab(1):=1000;
	tab(4):=200;
	dbms_output.put_line(tab.count);
	for i in tab.first..tab.last loop  
		if(tab.exists(i))then
			dbms_output.put_line(tab(i));
		else
			dbms_output.put_line('no data in slot:'||i);
		end if ;
	end loop;
	
	dbms_output.put_line(tab.next(0));
	dbms_output.put_line(tab.prior(0));
	dbms_output.put_line(tab.next(1));
	dbms_output.put_line(tab.next(2));
	dbms_output.put_line(tab.next(4));
	dbms_output.put_line(tab.prior(5));
end;
---------------varray
declare
	type my_numbers_type is varray(4) of number;
	my_numbers my_numbers_type;
begin
	my_numbers:=my_numbers_type(3,4,5); --初始化
	for i in 1..my_numbers.count loop
		dbms_output.put_line(my_numbers(i));
	end loop;
end;
---------------创建对象
create or replace type point_type is object(
	x number,
	y number);
create or replace type points_varray_type is varray(10) of point_type;
create or replace type points_nested_table_type is table of point_type; --嵌套表

declare 
	type points_varray_type is varray(10) of point_type;
	points points_varray_type:=points_varray_type();
	a_point point_type;
	pt point_type;
begin
	a_point:=point_type(3,4); 
	points:=points_varray_type(point_type(1,2),point_type(2,3),															            
a_point,point_type(4,5));  --初始化
	for i in 1..points.count loop
		pt:=points(i);
		dbms_output.put_line('x='||pt.x||', y='||pt.y);
	end loop;
end;

---------嵌套表
create table environment_data(
	sample_id number(3),
	points_varray points_varray_type,
	points_nested_table points_nested_table_type)
	nested table
	points_nested_table store as points_nested_tab; --指定嵌套表变量;
-------------
declare
	a_points_varray points_varray_type:=points_varray_type();
	a_points_nested_table points_nested_table_type;
begin
	insert into environment_data
		(sample_id,points_varray,points_nested_table)
	values(1,points_varray_type(point_type(3,4),point_type(3,5)),					points_nested_table_type(point_type(1,2),point_type(5,9)));

	a_points_varray:=points_varray_type(point_type(1,2),point_type(2,3));
	a_points_nested_table:=points_nested_table_type(point_type(10,11));
	
	insert into environment_data(sample_id,points_varray,points_nested_table)
	values(2,a_points_varray,a_points_nested_table);
	select points_varray,points_nested_table into
		a_points_varray,a_points_nested_table from environment_data 
	where sample_id=1;
end;

---------------------------对象
create or replace type points_object_type as object(
	points points_nested_table_type,
	member function sample_size return number;
	member function point_text return varchar2;
	member function min_x return number;
	member function max_x return number,
	member function avg_x return number,
	member function best_point return point_type,
	member procedure add_to(v point_type));
	
create or replace type body points_object_type as object(
	member function sample_size return number is
	begin
		return points.count;	
	end;
	member function point_text return varchar2 is
		s varchar2(1000);
	begin
		for i in 1..points.count loop
			s:=s||' ('||point(i).x||','||point(i).y||')';
		end loop;
		return s;
	end;
	member function min_x return number is
		result number:=null;
	begin
		for i in 1..points.count loop
			result:=least(nvl(result,point(i).x),point(i).x);
		end loop;
	end;
	
	member function max_x return number is 
		result number:=null;
	begin
		for i in 1..points.count loop
			result:=greatest(nvl(result,point(i).x),point(i).x);
		end loop;
	end;
	
	member function avg_x return number is
		result number:=0;
	begin
		for i in 1..points.count loop
			result:=result+point(i).x;
		end loop;
		return result/points.count;
	end;
	
	member function best_point return point_type is
		pt point_type;
	begin
		pt:=point_type(point(1).x,points(points.count).y);
		return pt;
	end;
	
	member procedure add_to(v point_type) is
	begin
		points.extend; --表扩展
		points(points.count):=v;
		exception when others then
			points:=points_nested_table_type(v); --返回一个?
	end;
	
end;
	
------------------------- 使用对象
create table test_data(
	sample_id number(3),
	points_object points_object_type)
	nested table
	points_object.points store as points_object_tab;
	
declare 
	point_obj points_object_type:=points_obejct_type(
		points_nested_table_type());
	best_point point_type;
begin
	point_obj.add_to(point_type(2,3));
	point_obj.add_to(point_type(6,1));
	point_obj.add_to(point_type(7,3));
	point_obj.add_to(point_type(8,3));

	insert into test_data(sample_id,points_object)
	values(1,point_obj);
	select points_object into point_obj from 
		test_data where sample_id=1;
		
	dbms_output.put_line(point_obj.min_x);
	dbms_output.put_line(point_obj.max_x);
	dbms_output.put_line(point_obj.avg_x);
	best_point:=point_obj.best_point;
	dbms_output.put_line('x='||best_point.x||',y='||best_point.y);
end;
	
-------------------blob操作 大对象
blob 二进制大对象 图像
clob 字符对象
bfile 用于引用文件

create table doc(
	doc_id number(5) primary key,
	document clob);
insert into doc(doc_id,document) values(1,empty_clob()); --空文档

--创建逻辑连接 地位物理文件位置 create any directory权限
create or replace directory sample_docs as 'd:\docs'; 
----------------- 写文件
declare
	the_bfile bfile;
	the_clob clob;
	bfile_size pls_integer;
	clob_size pls_integer;
	v_directory varchar2(30):='SAMPLE_DOCS'; 
	v_filename varchar2(30):='users_manual.pdf';
begin
	the_bfile:=bfilename(v_directory,v_filename); --bfile 逻辑路径获取
	select document into the_clob from doc where doc_id=1 --clob
	for update of doc.document nowait;  --clob

	dbms_lob.open(the_clob,dbms_lob.lob_readwrite); --open clob
	dbms_lob.fileopen(the_bfile,dbms_lob.file_readonly);--open bfile
	bfile_size:=dbms_lob.getlength(the_bfile); 

	dbms_lob.loadfromfile(the_clob,the_bfile,bfile_size); --load to clob
	clob_size:=dbms_lob.getlength(the_clob);
	dbms_lob.fileclose(the_bfile);--close
	dbms_lob.close(the_clob);
	commit;
end;

---------------------读取clob
declare
	the_clob clob;
	clob_size pls_integer;
	max_size pls_integer:=50;
	amount_to_read pls_integer;
	offset pls_integer:=1;
	vbuf varchar2(100):=null;
begin
	select document into the_clob from doc where doc_id=1;  --clob
	--dbms_lob.close(the_clob);
	dbms_lob.open(the_clob,dbms_lob.lob_readonly);--open clob
	clob_size:=dbms_lob.getlength(the_clob);
	amount_to_read:=lease(clob_size,max_size);
dbms_lob.read(the_clob,amount_to_read,offset,vbuf); --read clob 缓冲区要>=长度2倍?
	dbms_lob.close(the_clob); --close
	dbms_output.put_line(vbuf);--replace(vbuf,chr(10),'-')); --替代换行,完全输出
end;	
--------------------case 语句
create table hello (a number(2));
insert into hello values(11);

declare 
	b integer;
begin
	select case
		when a<10 then 1
		when a>=10 and a<20 then 2
		when a>255 then 3 end
	into b from hello;
	dbms_output.put_line('b='||b);
end;

---------- decode
declare 
	b integer;
begin
	select decode(a,'A',0,'B',1,2)
	into b from hello;
	dbms_output.put_line('b='||b);
end;

declare
	name emp.ename%type;
	procedure p(s varchar2) is  --内部
	begin
		dbms_output.put_line(s);
	end;
begin
	name:='kevain';
	case name
		when 'hell' then p('a1');
		when 'john' then p('a2');
		when 'kevin' then p('a3');
		else p('nothing!');
	end case;
end;

-------------------loop
declare
	counter integer:=10;
begin
	loop 
		dbms_output.put_line(counter);
		counter:=counter-1;
		exit when counter=0; -- if counter=0 then exit; end if;
	end loop;
end;

declare 
	ascii_code integer:=97;
	alphabet varchar2(26):=null;
begin
	while(nvl(length(alphabet),0)<26) loop
		alphabet:=alphabet||chr(ascii_code);
		ascii_code:=ascii_code+1;
	end loop;
	dbms_output.put_line(alphabet);

end;

select instr('/aa/bb/cc/dd','/',-1,1) from dual; --最后一个斜杠位置

create or replace function pad_number(n number) return varchar2 is 
	the_pad varchar2(3);
	the_number varchar2(30):=to_char(n);
begin
	select decode(instr(the_number,'.',1),0,'.00',
		length(the_number)-1,'0') into the_pad
	from dual;
	return '$'||to_char(n)||the_pad;
end;

select next_day(trunc(sysdate),'星期六') from dual;

---------------------文件读取
create or replace function get_next_record
	(file in utl_file.file_type,text out varchar2) return boolean is
begin
	utl_file.get_line(file,text);  --read line
	return false;
	exception when no_data_found then
		return true;
end;

create or replace directory D_OUTPUT as 'D:\TEMP';
grant read,write on directory D_OUTPUT to testdb;
GRANT EXECUTE ON utl_file TO testdb;

declare 
	file utl_file.file_type;
	text varchar2(1000);
	end_of_file boolean:=false;
begin
	file:=utl_file.fopen('SAMPLE_DOCS','test.txt','r'); --open
	loop 
		end_of_file:=get_next_record(file,text);
		exit when end_of_file;
		dbms_output.put_line(text);
	end loop;
	utl_file.fclose(file); --close
	exception
		when utl_file.invalid_path then
			dbms_output.put_line('Invalid Path!');
		when utl_file.invalid_mode then
			dbms_output.put_line('Invalid Mode!');
		when utl_file.invalid_operation then
			dbms_output.put_line('Invalid Operation!');
end;


分享到:
评论

相关推荐

    SQLServer2008数据库基础入门教程含思考题练习题 第11章 存储过程 触发器和函数 共62页.ppt

    本章主要关注存储过程、触发器和用户定义函数。 **存储过程**是数据库中的重要组成部分,它是一个预编译的SQL代码模块,可以高效地执行特定任务,并且是可重用的。存储过程分为三种类型:用户定义存储过程、扩展...

    信息存储与检索 张帆 课件4-11章

    张帆教授的这门课程涵盖了从第4章到第11章的内容,涉及了信息存储系统的基础理论、技术和实践应用。在这个压缩包中,22236-00_1-3可能是课件的组成部分,可能包括讲义、幻灯片或者其他教学材料。 信息存储与检索的...

    SQL Server 2008完全学习手册视频教程.zip

    第11章 SQL Server 2008的安全机制 第12章 备份与恢复数据库 第13章 自动化SQL Server 2008数据库 第14章 集成服务 第15章 报表服务 第16章 分析服务 第17章 使用.NET 访问SQL Server 2008 第18章 监视SQL Server ...

    C++ Primer Plus 编程练习源码工程 第11章

    在第11章的练习中,你可能会接触到如何使用STL容器存储和操作数据,以及如何使用STL算法进行排序、查找等操作。 3. **面向对象编程(OOP)**:C++是一种支持面向对象编程的语言,第11章可能涉及继承、多态和封装等...

    mysql学习重点总结(小白适合学习哦)

    第18章 主从复制.assets第17章 其它数据库日志.assets第16章 多版本并发控制,assets第15章 锁,assets第14章 MySQL事务日志.assets第13章 事务基础知识.assets第12章 数据库其它调优策略,assets第11章 数据库的设计...

    第四十七章:ISCSI 企业共享存储方案.pdf

    第四十七章:ISCSI 企业共享存储方案 本章节主要讲述了企业共享存储方案中的ISCSI技术,涵盖了存储概述、存储分类、ISCSI概念、ISCSI技术的应用等内容。通过本章节的学习,读者将了解到企业存储应用内容、存储分类...

    C#语言和SQL Server数据库基础第11章.zip

    在这一章,你将学习如何定义和实例化类,理解类和对象的关系,以及如何使用构造函数和析构函数。此外,还将深入学习C#中的控制流语句,如if条件判断、switch语句、循环(for、while、foreach)以及异常处理机制。 ...

    联想DM存储设备 netapp 设备ontap概念指南

    最后,第十五章介绍了ONTAP的发布模型,这有助于用户了解软件更新和版本控制的过程。第十六章则提供了进一步学习和获取支持的资源。 综上所述,《联想DM存储设备 NetApp设备ONTAP概念指南》是一份全面的技术资料,...

    疯狂Android讲义第二版光盘源码(第十一章到十五章)

    《疯狂Android讲义第二版》是一本深入浅出的Android开发教程,其光盘源码涵盖了从第十一章到第十五章的重要知识点。这些章节主要涉及Android应用开发的高级技术,包括用户界面优化、多媒体处理、网络编程、数据存储...

    数据库系统概论_王 珊_课后习题答案(全)

    第十一章至第十三章则关注数据库的安全性和完整性,包括访问控制、权限管理以及触发器和存储过程的使用。习题可能涉及如何设置用户权限,或者设计能够确保数据完整性的触发器。 最后,第十四章可能涉及数据库的备份...

    MySQL8.0学习第一章

    【MySQL8.0学习第一章】 在本章的学习中,我们将深入了解MySQL数据库系统,这是一个广泛应用于各种行业的关系型数据库管理系统(RDBMS)。首先,我们从基础出发,了解数据库的概论,包括数据、数据库、数据库管理...

    ORACLE学习笔记2:日常应用、深入管理、性能优化.

    第11章 PL/SQL语言基础 第12章 存储过程和触发器 第13章 游标 第14章 任务调度 第15章 事务与锁定 第3篇 系统优化 第16章 数据库内存和进程的配置与优化 第17章 常用性能监测、分析和优化工具 第18章 对SQL...

    数据结构第十一章课件

    ### 数据结构第十一章知识点详解 #### 一、章节概述 本章节主要介绍了高级线性表中的几个核心概念和技术,包括多维数组、广义表以及存储管理技术。通过学习这些内容,我们可以更好地理解如何有效地组织和处理复杂的...

    DAMA学习笔记-第01-17章细化第5章数据建模较多内容.pdf

    第11章 数据仓库和数据智能 数据仓库和数据智能是指对数据的存储和分析,以支持业务决策和intelligence。这一章节主要介绍了数据仓库和数据智能的定义、重要性、方法和工具。 第12章 元数据管理 元数据管理是指对...

    第十、十一讲第6章函数、存储类和预处理程序PPT学习教案.pptx

    【函数】在C语言中,函数是一段可重复使用的代码块,用于执行特定任务。例如,`void f()`定义了一个名为`f`的无返回值的函数。在`main()`函数中,`f()`被调用,但需要注意的是,函数内的变量只在其定义的函数作用域...

    Visual C++范例大全第十一章至十七章,不要金币,免费下

    这本书的第十一章至十七章涵盖了多个关键领域,包括进程与线程管理、DLL开发与系统编程、网络编程、数据库操作、数字图像处理以及多媒体开发,这些都是现代软件开发中的重要组成部分。 第十一章《进程与线程》是...

    android 从入门到精通第11,13,14,15章书中源代码

    这一章可能涵盖了XML布局文件的创建,包括线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)和网格布局(GridLayout)等基本布局类型。此外,还可能讲解了如何使用View和 ViewGroup,...

    ACCP8.0S2-Y2转换教材第十一章

    通过【elevenWork】这个文件名,我们可以推测这可能是第十一章的工作文件或练习,其中可能包含练习代码、测试用例和解决方案,供学习者动手实践和巩固所学知识。 总的来说,ACCP8.0S2-Y2的第十一章内容全面且深入,...

    《学习opencv》第十一章标定程序可运行代码

    《学习OpenCV》第十一章主要讲解了相机标定的过程,这是计算机视觉领域的一个关键步骤,用于纠正由相机镜头引起的图像畸变,并获取相机的内在参数。本章的可运行代码提供了实现这一过程的实际示例,帮助读者深入理解...

Global site tag (gtag.js) - Google Analytics