首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

10年读pl/sql编程指南敲上了下面大部分例子二(备用)

2012-07-05 
10年读pl/sql编程指南敲下了上面大部分例子二(备用)--(4)在forall子句中使用bulk子句declaretype ename_ta

10年读pl/sql编程指南敲下了上面大部分例子二(备用)

--(4)在forall子句中使用bulk子句         declare          type ename_table_type is table of emp.ename%type;         type sal_table_type is table of emp.sal%type;         ename_table ename_table_type;         sal_table sal_table_type;         sql_stat varchar2(100);         begin         ename_table:=ename_table_type('SCOTT','ins','SMITH');         sql_stat:='update emp set sal=sal*1.1 where ename=:1 returning sal into :2';         forall i in 1..ename_table.count          execute immediate sql_stat using ename_table(i) returning bulk collect into sal_table;         for j in 1..ename_table.count loop         dbms_output.put_line(ename_table(j)||' '||sal_table(j));         end loop;         end;    --对象类型         --1,建立使用不包含任何方法的对象类型         --(1)建立对象类型         create or replace type person_type1 as object(name varchar2(10),gender varchar2(2),birthdate date);            --(2)使用对象类型         create table person_typ1 of person_type;         --(3)使用对象类型的构造函数给表添加数据         insert into person_typ1 values(person_type('张三','M','12-4月-2010'));         select * from person_typ1;         --(4)检索行对象数据         declare         person person_type;         begin         select value(p) into person from person_typ1 p where p.name='&name';         dbms_output.put_line('性别:'||person.gender);         end;           --删除         begin         delete from person_typ1 where name='张三';         end;         --(5)建立列对象         create table employee_tab1(                eno number(6),person person_type,                sal number(6,2),job varchar2(10)         );         --(6)为列对象插入数值         insert into employee_tab1(eno,sal,job,person) values('1','8000','MGR',person_type('李四','F','4-5月-2010'));         --(7)检索对象类型列的数据         declare         person person_type;         salary employee_tab1.sal%type;         begin         select person,sal into person,salary from employee_tab1 where eno=&no;         dbms_output.put_line('雇员名:'||person.name||',工资:'||salary);         end;         --2.建立和使用包含member方法的对象类型         --(1)建立对象类型(也叫做对象类型规范)         create or replace type person_type2 as object(                name varchar2(10),gender varchar2(2),                birthday date,address varchar2(100),                member procedure change_address(new_addr varchar2),                member function get_info return varchar2          );         --(2)建立对象类型体         create or replace type body person_type2 is          member procedure change_address(new_addr varchar2)         is begin         address:=new_addr;         end;         member function get_info return varchar2         is v_info varchar2(100);         begin         v_info:='姓名:'||name||',出生日期:'||birthday;         return v_info;         end;         end;         create table employee_tab2(                eno number(6),person person_type2,                sal number(6,2),job varchar2(10)         );         insert into employee_tab2 values(1,person_type2('王五','M','9-8月-2010','杭州'),8000,'SALE');         insert into employee_tab2 values(2,person_type2('孙六','M','9-8月-2010','杭州'),6000,'MGR');         declare         persona person_type2;         begin         select person into persona from employee_tab2 where eno=&no;         persona.change_address('呼和浩特');         update employee_tab2 set person=persona where eno=&no;         end;         --(3)实现对象类型体的继承         --创建父类         create or replace type person_type3 as object(              name varchar2(10),gender varchar2(2),              birthdate date,address varchar2(20),              member function get_info return varchar2         ) not final;         --定义父类方法         create or replace type body person_type3 as          member function get_info return varchar2         is begin         return '姓名:'||name||',家庭住址:'||address;         end;         end;          --创建子类         create or replace type employee_type3 under person_type3(                eno number(6),job varchar2(10),                sal number(6,2),member function get_other return varchar2         );         --创建子类方法         create or replace type body employee_type3 as          member function get_other return varchar2         is begin         return '雇员名称:'||name||',工资:'||sal;         end;         end;            --建立并操作对象表         create table employee_tab3 of employee_type3;         insert into employee_tab3 values('张三','男','8-5月-1886','南阳',1,'MGR',5600);         insert into employee_tab3 values('李四','男','8-5月-1886','郑州',2,'MGR',6000);         declare         v_employee employee_type3;         begin         select value(a) into v_employee from employee_tab3 a where a.eno=&no;         dbms_output.put_line(v_employee.get_info);         dbms_output.put_line(v_employee.get_other);         end;    --维护对象类型         --(1)显示对象类型信息         select * from user_types;           desc person_type3;            --(2)增加或删除对象类型属性         alter type person_type add attribute address varchar2(50) cascade;         alter type person_type drop attribute address cascade;         --(3)增加或删除对象类型的方法         alter type person_type add member function get_info return varchar2 cascade;         create or replace type body person_type as          member function get_info return varchar2         is begin          return '姓名:'||name||',性别:'||gender;         end;         end;     --dbms_lob包         --1.常量         file_readonly CONSTANT BINARY_INTEGER:=0;         lob_readonly CONSTANT BINARY_INTEGER:=0;         lob_readwrite CONSTANT BINARY_INTEGER:=1;         session CONSTANT PLS_INTEGER:=10;         call CONSTANT PLS_INTEGER:=12;         --2.APPEND(用于将两个lob类型的变量累加,适用于clob,blob)         declare          dest_lob clob;         src_lob clob;         begin         src_lob:='中国';         dest_lob:='你好,';         dbms_lob.append(dest_lob,src_lob);         dbms_output.put_line(dest_lob);         end;         --3.过程close(用于关闭已经打开的lob,适用于clob/nclob,blob,bfile类型)         dbms_lob.close                                                           --学海拾贝         --查询数据库版本         select * from v$version;         --查询数据库所有的角色         select * from dba_roles;         --查询数据库所有的用户(包括用户密码,表空间)         select * from dba_users;         --查询用户的权限         select * from dba_role_privs where grantee='HHH';         --查询用户信息(默认表空间,状态等)         select * from user_users;         --查询用户下所有的object(包括表,索引,序列等)         select * from user_objects;         --创建表空间(一般表空间名和用户名都用大写的创建)         CREATE TABLESPACE SJYD DATAFILE 'C:\SJYD_DATA.DBF' SIZE 5M DEFAULT STORAGE (INITIAL 50K NEXT 50K MAXEXTENTS UNLIMITED PCTINCREASE 1);         --创建用户(设置默认的表空间)         CREATE USER SJYD IDENTIFIED BY SJYD123 DEFAULT TABLESPACE SJYD TEMPORARY TABLESPACE TEMP PROFILE DEFAULT;         --为用户设置权限         GRANT "CONNECT" TO "SJYD";         GRANT "EXP_FULL_DATABASE" TO "SJYD";         GRANT "IMP_FULL_DATABASE" TO "SJYD";         ALTER USER "SJYD" DEFAULT ROLE ALL;         ALTER USER SJYD ACCOUNT UNLOCK;         --删除表空间和用户         DROP TABLESPACE SJYD;         DROP USER SJYD CASCADE;         --导出数据         exp sjyd/sjyd123@oracle file='d:\sjyd.dmp' full=y;         --导入数据         imp sjyd/sjyd123@oracle file='d:\sjyd.dmp' fromuser=sjyd touser=hhh;         imp sjyd/sjyd123@oracle file='d:\sjyd.dmp' full=y;         --数据库进行闪回         exec dbms_flashback.enable_at_time(to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss'));         --单表进行闪回         alter table tablename enable row movement;         flashback table tablename to timestamp('2010-08-17 15:00:00');         alter table tablename disable row movement;         --查询表的创建时间         select * from user_objects WHERE object_name='TABLE_NAME';         select * from all_objects where object_name='ITABLE_NAME';         --查询用户的默认表空间         select username,default_tablespace from user_users where username='SCOTT';                  --对表的操作         select * from dba_recyclebin a where a.original_name='tablename';--查询该表被操作的时间(删除操作)         select * from recyclebin;--查看回收站,里面有被删除表的信息和删除时间。         flashback table tablename to before drop;--将删除的表进行闪回。         select * from t as of timestamp to_timestamp('2010-06-29 22:57:47', 'yyyy-mm-dd hh24:mi:ss');--查询该时间点的数据                --建表同时建主外键         create table t_sun(sno varchar2(5),id number,sname varchar2(10),         constraint pk_sno primary key(sno),         constraint fk_id foreign key(id) references t(id));         --设置数据库的审计功能(audit,对表的修改进行跟踪记录)         show parameter audit;--查看审计功能是否开启         alter system set audit_sys_operations=true scope=spfile;--审计管理用户(以sysdba/sysoper角色)         alter system set audit_trail=db,extended scope=spfile;--开启审计功能,并且将更改反映到实例文件         startup force;--重启实例。         show parameter audit;--查看是否开启         audit all to emp;--设置对某个表对象进行审计。         select * from dba_audit_trail;--查询审计记录。         alter system set audit_trail=none;--关闭审计。                  --oracle全表扫描的四种类型 http://blog.csdn.net/tianlesoftware/archive/2010/08/31/5852106.aspx                  --判断是否是pl/sql进行的用户连接,建立触发器         create or replace trigger check_client         after logon on database         begin         for c in (select null from v$session where sid=userenv('sid') and program='plsqldev.exe') loop         raise_application_error(-20001,'Deny PLSQL Developer connection.');         end loop;         end;         --进行数据库备份与恢复(rman)                          --建立记录类型(用于单行多列)         declare type emp_record_type is record(                 name emp.ename%type;                 sal emp.sal%type         );      --使用索引表类型(数组,用于多行单列,下标可以从负值开始,无长度限制)         declare type ename_table_type is table of emp.ename%type index by binary_integer;         ename_table ename_table_type;         begin         select ename into ename_table(1) from emp where empno=&no;         dbms_output.put_line('雇员名:'||ename_table(1));         end;--使用binary_integer类型                  declare type area_table_type is table of number index by varchar2(10);         area_table area_table_type;         begin         area_table('北京'):=1;         area_table('上海'):=2;         area_table('广州'):=3;         dbms_output.put_line('第一个元素:'||area_table.first);         dbms_output.put_line('最后一个元素:'||area_table.last);         end;--使用varchar2类型     --嵌套表(下标从1开始,元素个数无限制,使用时必须先使用构造方法初始化嵌套表变量)         declare type ename_table_type is table of emp.ename%type;         ename_table ename_table_type;         begin         ename_table:=ename_table_type('mary','mary');         select ename into ename_table(2) from emp where empno=&no;         dbms_output.put_line('雇员名:'||ename_table(2));         end;              --变长数组varray(下标从1开始,有限长度,必须要初始化)         declare type ename_table_type is varray(20) of emp.ename%type;         ename_table ename_table_type:=ename_table_type('mark');         begin         select ename into ename_table(1) from emp where empno=&no;         dbms_output.put_line('雇员名:'||ename_table(1));         end;         --记录表(处理多行多列的数据)         declare type emp_table_type is table of emp%rowtype index by binary_integer;         emp_table emp_table_type;         begin         select * into emp_table(1) from emp where empno=&no;         dbms_output.put_line('雇员名'||emp_table(1).ename);         dbms_output.put_line('工资'||emp_table(1).sal);         end;         --使用多级嵌套表         declare type al_table_type is table of int;         type nal_table_type is table of al_table_type;         nal_table nal_table_type:=nal_table_type(al_table_type(2,34),al_table_type(2,3));         begin         dbms_output.put_line('显示二维数组所有元素');         for i in 1..nal_table.count loop             for j in 1..nal_table(i).count loop                 dbms_output.put_line('nal_table('||i||','||j||')='||nal_table(i)(j));             end loop;         end loop;         end;    

热点排行