******************************************
数据库之【标量类型及其使用篇】
******************************************
【1.标量类型】
--数字
binary_integer --带符号的整数-2的31次幂-1到2的31次幂到-1
natural --自然数
naturaln --非自然数且非空
positive --正整数
positiven --非正整数且非空
signtype --只能存1、0、-1三个值
number --存整数、定点数、浮点数
float --126位的二进制的浮点数
decimal --38位十进制的定点数
integer --38位十进制数字的整数
real --63位二进制数字的浮点数
pls_integer --带符号的整数、区别是以机器运算为基础,速度快、存储空间小
--字符
char --固定长度的字符32767
raw --存二进制数据或字节串
long long raw --可变长度字符串32760
varchar2(varchar string)--可变长度的字符串32767
数据类型 SQL类型 PL/SQL类型
CHAR 1..2000 1..32767
LONG 1..2GB 1..32760
LONG RAW1..2GB 1..32760
RAW 1..2000 1..32767
VARCHAR2 1..4000 1..32767
--日期
date --日期时间
timestamp--日期时间精确到小数秒到小数后0-9(默认6)位
--布尔
boolean
--LOB类型 存储非结构化数据
blob/clob/nclob/bfile
--属性类型
%type --变量或表字段对象的引用
%rowtype--表行的引用
【ORACLE中定义变量的几种方式】
--声明可从外面接收的参数
num number :=&id;
--声明可从外面接收的公用变量,并有提示
accept num prompt '请输入一个数字:';
--使用时:&num就可以在PLSQL块中访问
--声明可以公用的变量
variable num number;
--在PLSQL语句外进行赋值
execute :num :=100;
--在PLSQL语句中进行使用
:num :=100;
【2.举例使用】
--2.1 BFILE使用示例
select * from dba_directories; --查询系统中创建的所有目录,在SYS用户下
--创建目录
create directory book_text as 'c:\text';
grant read on directory images to scott;
create table my_book (file_descr varchar2(40),book_file bfile);
--插入
insert into my_book values('第一章',bfilename('BOOK_TEXT','test.txt'));
--读写
declare--写
fhandle utl_file.file_type;
begin
fhandle := utl_file.fopen('BFILE_DIR', 'lunartest1.txt', 'w');
utl_file.put_line(fhandle, 'aaa');
utl_file.put_line(fhandle, 'bbb');
utl_file.fclose(fhandle);
end;
/
declare--读
fhandle utl_file.file_type;
fp_buffer varchar2(4000);
begin
fhandle := utl_file.fopen('BFILE_DIR', 'lunartest1.txt', 'R');
utl_file.get_line(fhandle, fp_buffer);
dbms_output.put_line(fp_buffer);
utl_file.get_line(fhandle, fp_buffer);
dbms_output.put_line(fp_buffer);
utl_file.fclose(fhandle);
end;
/
--2.2 BLOB使用示例
create directory images as 'c:\images'; --创建目录
grant read on directory images to scott;--授权给用户
create table my_img(img_no number,img_name varchar2(200),img blob); --建BLOB类型字段表
--将文件中的图片存到数据库中
declare
l_bfile bfile;
l_blob blob;
begin
insert into my_img (img) values (empty_blob()) return img into l_blob;
l_bfile := bfilename('IMAGES', '\one.jpg');
dbms_lob.open(l_bfile, dbms_lob.file_readonly);
dbms_lob.loadfromfile(l_blob, l_bfile, dbms_lob.getlength(l_bfile));
dbms_lob.close(l_bfile);
commit;
end;
--2.3 CLOB示例
create table test1(tno number,tname varchar2(200),text clob);
insert into test1 values(1,'李海','追求幸福美好的生活将使他的青春变作一曲闪光的乐章!');
declare
c_text clob;
sta number;
len number;
t_text varchar2(2000);
begin
select text into c_text from test1 where tno = 1;
sta := 1;
len := 5;
--len :=length(c_text);--用函数获取文本长度
dbms_lob.read(c_text, len, sta, t_text);
dbms_output.put_line(t_text);
end;
--2.4 TABLE类型示例(组合类型的使用)
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE;
emp_tab EmpTabTyp := EmpTabTyp(NULL); -- initialize(定义同时初始化必须的)
BEGIN
SELECT * INTO emp_tab(1) FROM emp WHERE empno = 7788;
dbms_output.put_line(emp_tab(1).ename || ' sal is: ' || emp_tab(1).sal);
END;
--2.5 RECORD,VARRAY记录数组类型示例(组合类型的使用)
DECLARE
TYPE definition IS RECORD(
xm VARCHAR2(20),
gz VARCHAR2(200));
TYPE DICTIONARY IS VARRAY(2000) OF definition;
lexicon DICTIONARY := DICTIONARY(); --定义同时初始化(必须的)
BEGIN
lexicon.EXTEND;
select ename, job
into lexicon(1).zm,lexicon(1).gz
from emp
where empno = 7369;
DBMS_OUTPUT.put_line(lexicon(1).xm || lexicon(1).gz);
END;