Oracle基本数据类型:
Oracle的基本呢数据类型按类型分为:字符串类型,数据类型,日期类型,LOB类型等。
1.字符串类型:
①char:定长字符串,最多存储2k字节,在不指定char长度的情况下,默认为1个字节的长度。
②ncahr:包含UNCODE格式的定长字符串,最多可以存储2k的字节。
③varchar:变长字符串,与char类型不同,不会使用孔飞填充至最大长度,可以最大存储4k字节的信息。
④nvarchar:包含Unicode个数数据的变长字符串,最大存储为4k字节。
2.数据类型:
①number(精度,有效位数)。
②integer:是number的子类,等同于number(38,0),用于存储整数,在插入或者存储数据的时候带有小数部分将会被四舍五入。
③binary_float:是32位单精度浮点数据类型,可以支持到6位精度,每个binary_float的值需要5个字节包括长度字节。
④binary_double:长度为64位的双精度浮点数据类型,每个binary_double的值需要9个字节包括长度。
⑤float(n精度):精度表示可以存储数据的数目,n的范围可以从1到126.
3.日期类型:
①date:用于存储日期和时间信息,一般占有7个字节的空间。
②timestamp:与date类型不同的是timestamp可以包含小数秒,小数点右边最多可以保留9位。
③timestamp with time zone类型:是timestamp的一个变种,包含了时区偏移量的值。
④timestamp with local time zone类型:
⑤interval year to moth
⑥interval day to second
4.LOB类型:
①clob类型:存储unicode类型的数据,支持固定宽度和变宽的字符集,nclob对象可以存储最大(4 gigabytes-1) * (database block size)
②Blob类型:存储非结构化的二进制数据大对象,可以理解为没有字符集语义的比特流,一般是媒体文件。
③bfile类型:二进制文件,存储在数据库外的系统文件,只读,数据库会将该文件当二进制文件进行处理。
5.RAW & Long RAW类型:
①Long类型:存储变长字符串,最多可以存储2GB字节数据,long类型的存储限制:
一个表中只有一列可以为long类型。
long列不能定义为主键或唯一主键。
不能建立索引。
long数据不能指定正则表达式。
函数或存储过程不能接受long数据类型的参数。
long列不能出现在where子句或完整性约束(除了null和not null约束)。
②long raw类型:能存储2GB的原始二进制数据。
③raw类型:用于存储二进制或字符串类型,变长二进制数据类型。最多可以存储2k字节信息。
PL/SQL :
/**declare x number := 0; cursor cur1 is select * from emp; cursor cur2(eno number) is select * from emp where empno=eno;--参数游标 emp_record emp%rowtype;--表示emp表的行类型 begin open cur1;--打开游标 loop--循环提取游标中的数据 fetch cur1 into emp_record; exit when cur1%notfound; --dbms_output.put_line(emp_record.ename); end loop; close cur1;--关闭游标,释放内存 /*loop x:=x+1; dbms_output.put_line(x); exit when x>5; end loop; while x<8 loop x:=x+1; dbms_output.put_line(x); end loop; for x in reverse 1..6 loop dbms_output.put_line(x); end loop; select sal into x from emp where empno=1; exception when too_many_rows then dbms_output.put_line('too many rows'); when no_data_found then dbms_output.put_line('no data found'); when others then dbms_output.put_line('others'); select test(7499) from dual; --隐式游标 -- for rd in (select * from emp) loop -- dbms_output.put_line(rd.ename); --end loop; --参数游标: open cur2(7499); loop--循环提取游标中的数据 fetch cur2 into emp_record; exit when cur2%notfound; dbms_output.put_line(emp_record.ename); end loop; close cur2; end; */ --存储过程: /* 存储过程的语法: create [or replace] procedure 存储过程名[(参数[in | out | in out]数据类型...)] {is | as} [说明部分] begin 可执行部分 [exception 错误处理部分] end [过程名]; begin proc1; end;
存储方法:
create or replace function test(eno in number) return number is /* 函数的参数: in 参数 out 参数 in out 参数 */ salary number; begin select sal into salary from emp where empno=7499; return salary; exception when too_many_rows then return -1; when no_data_found then return -2; when others then return -3; end test; 游标: 1.在pl、sql块中执行select、insert、delete和update语句时,oracle会在内存中为其分配上下文区(缓冲区),游标是指向该区的一个指针或是命名一个工作区,或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式sql语句的应用程序的常用编程方式。 2.在每个用户会话中,可以同时打开多个游标,其数量有数据库初始化参数文件中的OPEN_CURSOR参数定义。 3.对于不同的sql语句,游标的使用情况不同: ①非查询语句:游标是隐式的;②结果时单行的查询语句:游标可以是隐式的或显示的;③结果时多行的查询语句:游标是显示的。 (1)显示游标:步骤一:游标的定义:CURSOR cursor_name[(parameter[,parameter]...)][RETURN datatype] IS select_statement; 步骤二:打开游标:OPEN cursor_name[([parameter=>]value[,[parameter=>]value]...)]; 步骤三:提取游标数据:FETCH cursor_name INTO {variable_list|record_variable}; 步骤四:关闭游标:CLOSE cursor_name; 游标的属性:cursor_name%FOUND:boolean,当最近一次提取游标惭怍fetch成功则为true,否则为false; cursor_name%NOTFOUND:boolean,与cursor_name%FOUND相反; cursor_name%ISOPEN:boolean,当游标已经打开时返回true; cursor_name%ROWCOUNT:数字类型属性,返回已经从游标中读取的记录数;
存储过程:
create or replace procedure proc1(eno in number,salary out number) is begin select sal into salary from emp where empno=eno; dbms_output.put_line(salary); end proc1; /* 存储过程的调用方式: 1.在命令窗口下:exec produre_name(参数值...) SQL> set serverput on Cannot SET SERVERPUT SQL> set serveroutput on SQL> exec proc1; 1600 PL/SQL procedure successfully completed SQL> 2.在SQL窗口下: begin produre_name(参数值...) end; 3.一个存储过程中可以调用另一个存储过程。 储存过程的参数: in out in out 存储过程和函数的区别: 1.存储过程和函数以命名的数据库对象形式存储于数据库中。存储在数据库中的优点是很明显的,因为代码不用保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。 2.存储过程和函数除了返回结果有区别外,其实是一样的,存储过程不返回结果,函数要返回结果。 3.存储过程和函数可游由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或者创建者本身才能执行存储过程或调用函数。 4.存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的pl/sql程序或其他存储过程都可以调用它(但存储过程和函数不能调用pl/sql程序),一个重复使用的功能。可以设计成为存储过程,比如:显示一张工资统计表,可以设计成存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。 */
包:
1.包是用来存储相关程序结构的对象,它存储于数据字典中。 2.包由两个分离的部分组成:包头(package)和包体(packagebody)。包头是包的书名部分,是对外的操作接口,对应用是可见的;包体是包的代码和实现部分,对应用来说是不可见的黑盒。 3.创建包:包头:create [or replace] package_name [authid {current_user|definer}] {is | as} [共有数据类型定义[共有数据类型定义]...] [共有游标声明[共有游标声明]...] [共有变量、敞亮声明[共有变量、常量声明]...] [共有子程序声明[共有子程序声明]...] end [package_name]; 包体:create replace package body package_name is function 实现 procedure 实现 ... end package_name 删除包: 1.删除包头:drop package package_name 2.删除包体:drop package body package_name 3.重新编译包头:alter package package_name compile package 4.重新编译包体:alter package package_name compile package body */
create or replace package pkg1 is -- Author : 非若 -- Created : 2016/8/6 12:41:11 -- Purpose : function fn2(eno number)return varchar2; procedure proc3(eno number,sename out varchar2); end pkg1;
create or replace package body pkg1 is function fn2(eno number)return varchar2 is sename varchar2(20); begin select ename into sename from emp where empno=eno; return sename; end fn2; procedure proc3(eno number,sename out varchar2) is begin select ename into sename from emp where empno=eno; end proc3; end pkg1;