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;