1. ```sql
  2. --定义可被SQL语句调用的子程序
  3. create or replace function getempdept(
  4.       p_empno emp.empno%type
  5. )return varchar2
  6. as v_dname dept.dname%TYPE;
  7. begin
  8.   select b.dname into v_dname from emp a,dept b
  9.   where a.deptno=b.deptno and a.empno=p_empno;
  10.   return v_dname;
  11. exception
  12.    when no_data_found then
  13.      return null;
  14.      end;
  15.   
  16. select empno 员工编号,getempdept(empno) 部门名称 from emp;
  17.  
  18. --嵌套子程序重载
  19. declare
  20.        procedure getSalary(p_empno in number) is
  21.          begin dbms_output.put_line('员工编号为'||p_empno); end;
  22.        procedure getSalary(p_empname in varchar2) is
  23.          begin dbms_output.put_line('员工名称为'||p_empname); end;
  24.        procedure getSalary(p_empno in number,p_empname in varchar2) is
  25.          begin dbms_output.put_line('员工编号为'||p_empno||'员工名称为:'||p_empname); end;
  26.  begin
  27.      getsalary(7369);
  28.      getsalary('史密斯');
  29.      getsalary(7369,'史密斯');
  30.      end;          
  31.  
  32.  --自治事务使用示例  在主事务中开启一个独立的事务
  33.  create   table emp_history as select * from emp where 1=3;
  34.  select * from emp_history;
  35.  declare 
  36.         procedure TestAutonomous(p_empno number)  AS
  37.         pragma autonomous_transaction;       --标记为自治事务  
  38.     begin
  39.       insert into emp_history select * from emp where empno=p_empno;
  40.       commit;
  41.    end TestAutonomous;
  42.   begin    
  43.       insert into emp_history(empno,ename,sal) values(1011,'测试',1000);
  44.       TestAutonomous(7369);
  45.       rollback;
  46.       end;    
  47. select * from emp;
  48.  insert into emp select * from emp_copy;
  49.  delete from emp_history;
  50.  select * from emp_history;
  51. --在PL/SQL 中实现递归阶乘   
  52. declare
  53.   v_result integer;
  54.   function fac(n positive)
  55.       return integer is
  56.     begin
  57.        if n=1 then
  58.           dbms_output.put_line('');
  59.           return 1;  
  60.       else
  61.         dbms_output.put(n||'*');
  62.         return n*fac(n-1);       
  63.         end if; 
  64.       end fac;
  65.     begin
  66.       v_result:=fac(10);
  67.       dbms_output.put_line('结果是:'||v_result);
  68.       end;   
  69. excel 阶乘函数 fact  
  70. select floor(2345.67) from dual;
  71. FLOOR(2345.67)   
  72. create table staff (condtion varchar2(30));
  73. select * from staff;
  74. select * from emp;
  75. --使用递归查找职员列表示例
  76. declare 
  77.    procedure find_staff(mgr_no number, tier number :=1)
  78.      is boss_name varchar2(10);  --定义老板名称
  79.      cursor c1 (boss_no number)
  80.      is select empno,ename from emp where mgr=boss_no;
  81.    begin
  82.      select ename into boss_name from emp where empno=mgr_no;
  83.      if tier =1
  84.        then 
  85.          insert into staff values(boss_name||'是老板');
  86.      end if;
  87.      for ee in c1(mgr_no)
  88.       loop
  89.         insert into staff values(boss_name||'管理 '
  90.         || ee.ename||' 在层次 '||to_char(tier));
  91.       find_staff(ee.empno,tier+1);  
  92.         end loop; 
  93.         commit;    
  94.      end find_staff;  
  95.    begin
  96.      find_staff(7566);
  97.     end; 
  98.  
  99. create or replace procedure find_staff(mgr_no number, tier number :=1)
  100.      is boss_name varchar2(10);  --定义老板名称
  101.      cursor c1 (boss_no number)
  102.      is select empno,ename from emp where mgr=boss_no;
  103.    begin
  104.      select ename into boss_name from emp where empno=mgr_no;
  105.      if tier =1
  106.        then 
  107.          insert into staff values(boss_name||'是老板');
  108.      end if;
  109.      for ee in c1(mgr_no)
  110.       loop
  111.         insert into staff values(boss_name||'管理 '
  112.         || ee.ename||' 在层次 '||to_char(tier));
  113.       find_staff(ee.empno,tier+1);  
  114.         end loop; 
  115.         commit;    
  116.      end find_staff;
  117. delete  from staff;   
  118.  create table staff(emplist varchar2(30));
  119. select * from staff;    
  120. --查找所有表与emp表具有依赖的对象
  121. select name,type from user_dependencies where referenced_name='EMP';
  122. --查询间接依赖  1.执行app../utldtree.sql  2 exec deptree_fill('TABLE',''SCOTT,''EMP);
  123. select nested_level,name,type from deptree 
  124. where type in ('procedure','function');    --sqllus cmd
  125. --查看对象的有效性,当子程序依赖的
  126. alter table emp add emp_desc varchar2(200) null;
  127. alter table  emp drop column emp_desc;
  128. select object_name,object_type,status from user_objects 
  129. where object_name in ('emp');  --查询调用子程序的依赖关系
  130. --重新编译子程序
  131. alter procedure testsubprog complete;
  132. --子程序权限管理
  133. create user userb identified by userb;
  134. grant resource,connect to userb;
  135. --SCOTT方案
  136. grant execute on find_staff  to userb;
  137. --创建一个同义词视图,分配userb查询权限  DBA模式创建同义词**
  138. create public synonym emp for scott.emp;
  139. grant select any table to userb;
  140. grant create synonym to scott;
  141. begin
  142.   scott.find_staff(7369);
  143. end;
  144. select * from scott.emp;
  145. select * from staff;
  146. delete  from staff;
  147. create table staff(emplist varchar2(1000));
  148. --修改scott方案下的find_staff子程序,使之按调用者权限处理
  149.   authid current_user  is
  150.  
  151. --包重载
  152. create or replace package emp_action_pkg_overload is 
  153.        procedure newdept(
  154.          p_deptno dept.deptno%type,
  155.          p_dname dept.dname%type,
  156.          p_loc  dept.loc%type
  157.          );
  158.         procedure newdept(
  159.           p_deptno dept.deptno%type,
  160.           p_dname dept.dname%type
  161.           ); 
  162.           function getraisedsalary(p_empno emp.empno%type)
  163.             return number;
  164.           function getraisedsalary(p_ename emp.ename%type)
  165.             return number;  
  166. end emp_action_pkg_overload;
  167. --包含重载子程序包体实现
  168. create or replace package body emp_action_pkg_overload is
  169.        procedure newdept(
  170.          p_deptno dept.deptno%type,
  171.          p_dname dept.dname%type,
  172.          p_loc dept.loc%type
  173.          )as
  174.          v_deptcount number;
  175.          begin
  176.            select count(*) into v_deptcount from dept 
  177.            where deptno =p_deptno;
  178.            if v_deptcount > 0
  179.            then
  180.              raise_application_error(-20002,'出现了相同的员工记录');
  181.              end if;  
  182.              insert into dept(deptno,dname,loc) values(p_deptno,p_dname,p_loc);
  183.           end newdept;   
  184.          
  185.           procedure newdept(
  186.             p_deptno dept.deptno%type,
  187.             p_dname dept.dname%type
  188.             ) as
  189.             v_deptcount number;
  190.             begin
  191.               select count(*) into v_deptcount from dept
  192.               where deptno =p_deptno;
  193.               if v_deptcount>0
  194.                 then
  195.                   raise_application_error(-20002,'出现了相同的员工记录');
  196.                  end if;
  197.                  insert into dept(deptno,dname,loc) 
  198.                  values(p_deptno,p_dname,'中国'); 
  199.               end newdept;
  200.               function getraisedsalary (p_empno emp.empno%type)
  201.                 return number
  202.                 is v_job emp.job%type;
  203.                 v_sal emp.sal%type;
  204.                 v_salaryratio number(10,2);
  205.               begin          
  206.                 select job,sal into v_job,v_sal from emp where 
  207.                 empno=p_empno;
  208.                 case v_job
  209.                   when 'CLERK'  then
  210.                     v_salaryratio :=1.09;
  211.                    when 'SALESMAN' then
  212.                      v_salaryratio :=1.11;
  213.                     when 'MANAGER' then
  214.                       v_salaryratio :=1;
  215.                   end case;
  216.                   if v_salaryratio <>1
  217.                     then 
  218.                       return round(v_sal*v_salaryratio,2); 
  219.                   else
  220.                     return v_sal;
  221.                     end if;
  222.                 exception
  223.                    when no_data_found then
  224.                      return 0;
  225.                 end getraisedsalary;                  
  226.                 function getraisedsalary (p_ename emp.ename%type)
  227.                 return number
  228.                 is v_job emp.job%type;
  229.                 v_sal emp.sal%type;
  230.                 v_salaryratio number(10,2);
  231.               begin
  232.                 select job,sal into v_job,v_sal from emp where 
  233.                 ename=p_ename;
  234.                 case v_job
  235.                   when 'CLERK'  then
  236.                     v_salaryratio :=1.09;
  237.                    when 'SALESMAN' then
  238.                      v_salaryratio :=1.11;
  239.                     when 'MANAGER' then
  240.                       v_salaryratio :=1;
  241.                   end case;
  242.                   if v_salaryratio <>1
  243.                     then 
  244.                       return round(v_sal*v_salaryratio,2); 
  245.                   else
  246.                     return v_sal;
  247.                     end if;
  248.                 exception
  249.                    when no_data_found then
  250.                      return 0;
  251.                 end getraisedsalary;                  
  252.               function checkdeptno(p_deptno dept.deptno%type) return number
  253.                 as
  254.                  v_counter number(2);
  255.                begin
  256.                  select count(*) into v_counter from dept where deptno=p_deptno;
  257.                  return v_counter;
  258.                  end;                
  259.                 end emp_action_pkg_overload;              
  260. declare
  261.     v_sal number(10,2);
  262.   begin
  263.     emp_action_pkg_overload.newdept(43,' 样品部','东京');
  264.      emp_action_pkg_overload.newdept(44,' 纸品部');
  265.      v_sal:=emp_action_pkg_overload.getraisedsalary(7369);
  266.      v_sal:=emp_action_pkg_overload.getraisedsalary('SMITH')    
  267.     end;   
  268.  

  269.   create or replace type employee_obj as object (
  270. empno number(4),
  271. ename varchar2(20),
  272. job varchar2(20),
  273. sal number(10,2),
  274. comm number(10,2),
  275. deptno number(4),
  276. --定义对象类型方法
  277. MEMBER PROCEDURE Change_sal(p_empno number,p_sal number),
  278. member procedure change_comm(p_empno number,p_comm number),
  279. member procedure change_deptno(p_empno number,p_deptno number),
  280. member function get_sal(p_empno number) return number,
  281. member function get_comm(p_empno number) return number,
  282. member function get_deptno(p_empno number) return integer
  283. ) NOT FINAL  --指定该类可以被继承,如果指定final,表示该类无法被继承
  284. create or replace type body employee_obj
  285. as member procedure change_sal (p_empno number,p_sal number)
  286. is begin update emp set sal=p_sal where empno =p_empno; end;
  287. --定义对象成员方法,更改员工提成
  288. member procedure change_comm (p_empno number,p_comm number)
  289. is begin update emp set comm = p_comm where empno =p_empno;end;
  290. --定义对象成员方法,更改员工部门
  291. member procedure change_deptno (p_empno number,p_deptno number)
  292. is begin update emp set deptno =p_deptno where empno =p_empno;end;
  293. --定义对象成员方法,获取员工薪资
  294. member function get_sal(p_empno number) return number
  295. is  v_sal number (10,2); begin select sal into v_sal from emp
  296. where empno= p_empno; return v_sal; end;
  297. --获取员工提成
  298. member function get_comm(p_empno number) return number
  299. is v_comm number(10,2); begin select comm into v_comm from
  300. emp where empno = p_empno;return v_comm; end;
  301. --获取员工部门
  302. member function get_deptno (p_empno number) return integer
  303. is v_deptno int; begin select deptno into v_deptno from emp
  304. where empno =p_empno; return v_deptno; end;
  305.  
  306. declare
  307. v_emp employee_obj;
  308. v_sal v_emp.sal%type;
  309. begin
  310.     v_emp:=employee_obj(7890,'赵五','销售人员',5000,200,20);
  311.     v_sal :=v_emp.sal;
  312.     dbms_output.put_line(v_emp.ename||'的薪资是:'|| v_sal);
  313.   end;
  314.  
  315. --使用member和static成员法
  316. create or replace type employee_method as object(
  317.       empno number(4),
  318.       sal number(10,2),
  319.       comm number(10,2),
  320.       deptno number(4),
  321.       --实例方法,可以访问对象本身的属性
  322.       member procedure change_sal,
  323.       member function get_sal return number,
  324.       --静态方法,不能访问对象本身的属性,只能访问静态数据
  325.       static procedure change_deptno(p_empno number,p_deptno number),             
  326.       static function get_sal(p_empno number) return number
  327. ) not final;
  328. --定义employee_method对象类型体
  329. create or replace type body employee_method
  330. as  member procedure change_sal is
  331. begin self.sal :=self.sal*1.12;end;
  332. member function get_sal return number is
  333. begin return sal; end;
  334. static procedure change_deptno(p_empno number,p_deptno number)
  335. is  begin  update emp set deptno = p_deptno where empno=p_empno;end;
  336. static function get_sal(p_empno number) return number
  337. is v_sal number(10,2);
  338. begin
  339.   select sal into v_sal from emp where empno=p_empno;
  340.   return v_sal; end; end;
  341.  
  342.   --member和static 方法使用示例
  343.   member方法:基于对象实例而不是对象类型调用
  344.   static方法:静态方法独立与对象实例,不能在对象主体中引用对象属性
  345.   declare v_emp employee_method;
  346.   begin v_emp:=employee_method(7999,5000,200,20);
  347.   v_emp.change_sal;
  348.   dbms_output.put_line('员工编号为:'||v_emp.empno||'的薪资为:'||
  349.   v_emp.get_sal);
  350.  
  351.   --下面调用static方法更新emp表中员工编号为7369的部门为20
  352.   employee_method.change_deptno(7369,20);
  353.   dbms_output.put_line('员工编号为7369的薪资为:'||
  354.   employee_method.get_sal(7369));end;
  355. 定义构造函数
  356. 当定义了一个对象类型之后,系统会提供一个接收与每个属性相对应的
  357. 参数构造函数.因此在多数情况下,都不需要自己编写构造函数
  358. 自定义构造函数的目的
  359. 1.为对象提供初始化功能,可以通过构造函数进行统一初始化
  360. 2.可以在构造函数中为某些属性提供默认值,
  361. 3 避免更改调用构造函数的应用代码
  362. --自定义构造函数示例
  363. create or replace type salary_obj as object(
  364. percent  number(10,4),
  365. sal  number(10,2),
  366. --自定义构造函数
  367. constructor function salary_obj(p_sal number) return self as result)
  368. instantiable  --可实例化对象
  369. final;    --不可以继承
  370. create or replace type body salary_obj as
  371. constructor function salary_obj(p_sal number) return self as result
  372. as begin self.sal :=p_sal; self.percent:=1.12; return;end;
  373. end;
  374. declare
  375.   v_salobj1 salary_obj;
  376.   v_salobj2 salary_obj;
  377. begin
  378.   v_salobj1 := salary_obj(1.12,3000);
  379.   v_salobj2 :=salary_obj(2000);
  380.   end;
  381.  
  382.   MAP方法:该函数会将实例根据调用规则返回DATE,NUMBER,VARCHAR2类型的标量类型
  383. 定义了MAP函数以后,PLSQL会隐式通过调用MAP函数在多个对象间排序
  384. --定义MAP函数示例
  385. create or replace type employee_map as object(
  386.       empno number(4),
  387.       sal number(10,2),
  388.       comm number(10,2),
  389.       deptno number(4),
  390.       map member function convert return real  --定义一个map方法,real实数类型 科学计数法
  391. ) not final;
  392. --声明一个以map关键字开头的成员函数,该函数返回REAL类型
  393. --convert函数对对象进行由高到低的排序
  394. create or replace type body employee_map as
  395.       map member function convert return real is
  396.       begin
  397.         return sal +comm;  --返回标量类型的值
  398.         end;
  399.         end;
  400. --创建employee_map类型的对象表
  401. create table emp_map_tab of employee_map;
  402. insert into emp_map_tab values(7123,3000,200,20);
  403. insert into emp_map_tab values(7124,2000,800,20);
  404. insert into emp_map_tab values(7125,5000,800,20);
  405. insert into emp_map_tab values(7129,3000,400,20);
  406. --order by 1 表示的是第一栏
  407. select value(r) val,r.sal+r.comm from emp_map_tab r order by 1;
  408.  
  409. Order方法之能对两个对象之间进行比较,返回必须是数值类型
  410. 返回结果正数,负数或零,  只有2个参数self和另一个比较的类型
  411. --定义order函数示例
  412. create or replace type employee_order as OBJECT(
  413. empno number(4),
  414. sal number(10,2),
  415. comm number(10,2),
  416. deptno number(4),
  417. order member function match(r employee_order) return integer
  418. ) not final;
  419. create or replace type body employee_order as
  420.       order member function match(r employee_order)
  421.       return integer is begin
  422.       if ((self.sal+self.comm)<(r.sal+r.comm)) then return -1;
  423.     elsif((self.sal+self.comm)>(r.sal+r.comm)) then return 1;
  424.     else return 0;
  425.     end if;
  426.     end match; end;
  427.    
  428. declare
  429.     emp1 employee_order:=employee_order(7112,3000,200,20);
  430.     emp2 employee_order:=employee_order(7112,3000,200,20);
  431. begin
  432.   if emp1>emp2 then
  433.       dbms_output.put_line('员工1的薪资加提成比员工2大!');
  434.   elsif emp1<emp2 then
  435.       dbms_output.put_line('员工1的薪资加提成比员工2小!');
  436.   else
  437.     dbms_output.put_line('员工1的薪资加提成与员工2相等!');
  438.     end if; 
  439.   end; 
  440.  
  441. --使用order成员方法进行排序
  442. create table emp_order_tab of employee_order;
  443. insert into emp_order_tab values(7123,3000,200,20);
  444. insert into emp_order_tab values(7124,2000,800,20);
  445. insert into emp_order_tab values(7129,3000,800,20); 
  446. insert into emp_order_tab values(7125,5000,400,20);     
  447. select value(r) val,r.sal+r.comm from emp_order_tab r order by 1;
  448. map
  449. (1)将同一类型的对象实例映射成(number,date,varchar),之后进行比较。
  450. (2) map成员函数不接受形参;
  451.  
  452. order
  453. (1)两个对象实例进行比较
  454. (2)一个对象类型只能有一个map或order ,且不能同时有。
  455.  
  456. --使用嵌套对象类型
  457. --定义地址对象类型
  458. CREATE OR REPLACE TYPE address_type AS OBJECT
  459. (
  460.   street_addr1 VARCHAR2(25),
  461.   street_addr2 VARCHAR(25),
  462.   city         VARCHAR2(30),
  463.   state        VARCHAR2(2),
  464.   zip_code     NUMBER,
  465.   MEMBER FUNCTION toString RETURN VARCHAR2,
  466.   MAP MEMBER FUNCTION mapping_function RETURN VARCHAR2
  467. )
  468. CREATE OR REPLACE TYPE BODY address_type AS
  469.   MEMBER FUNCTION tostring RETURN VARCHAR2 IS
  470.   BEGIN
  471.     IF (street_addr2 IS NOT NULL) THEN
  472.       RETURN street_addr1 || chr(10) || street_addr2 || chr(10) || city || ',' || state || ' ' || zip_code; --chr(10)换行
  473.     ELSE
  474.       RETURN street_addr1 || CHR(10) || city || ',' || state || ' ' || zip_code;
  475.     END IF;
  476.   END;
  477.   MAP MEMBER FUNCTION mapping_function RETURN VARCHAR2 IS
  478.   BEGIN
  479.     RETURN TO_CHAR(NVL(zip_code,
  480.                        0),
  481.                    'fm00000') --fm00000 去掉前后空格
  482.     || LPAD(NVL(city,
  483.                 ''),
  484.             30) || LPAD(NVL(street_addr1,
  485.                             ''),
  486.                         25) || LPAD(NVL(street_addr2,
  487.                                         ''),
  488.                                     25);
  489.   END;END;
  490.   
  491.  
  492.  --定义一个对象规范,该规范中包含order方法
  493.  create or replace type employee_addr as object(
  494.         empno  number(4),
  495.         sal number(10,2),
  496.         comm number(10,2),
  497.         deptno number(4),
  498.         addr address_type,
  499.         member function get_emp_info return varchar2
  500.  ) not final;
  501.  create or replace type body employee_addr as 
  502.          member function  get_emp_info return varchar2
  503.          is begin 
  504.             return '员工'||self.empno||'的地址为'||self.addr.toString;
  505.          end;  end;  
  506.   
  507.  
  508.  declare
  509.          o_address address_type;
  510.          o_emp employee_addr;
  511.  begin
  512.          o_address:=address_type('玉兰一街','二巷','深圳','DG',523343);
  513.          o_emp:=employee_addr(7369,5000,800,20,o_address);
  514.          dbms_output.put_line('员工信息为'||o_emp.get_emp_info);
  515.  end;
  516. --对象的继承
  517. create or replace type person_obj as object(
  518.        person_name varchar(20),
  519.        gender varchar2(2),
  520.        birthdate date,
  521.        address varchar2(50),
  522.        member function get_info return varchar2 --返回员工信息
  523. )not final;
  524. create or replace type body person_obj as
  525. member function get_info return varchar2 is
  526. begin 
  527.   return '姓名:'||person_name|| ',家庭住址:'||address;
  528.   end; end;
  529. create or replace type employee_personobj under  person_obj(
  530.     empno number(6), sal number(10,2),job varchar2(10),
  531.     member function get_emp_info return varchar2,
  532.     --定义重载方法
  533.     overriding member function get_info return varchar2
  534. );
  535. create or replace type body employee_personobj as
  536.    member function get_emp_info return varchar2 is begin
  537.        return '员工编号:' ||self.empno ||'员工名称:'||self.person_name||
  538.        '职位:'||self.job; end; 
  539.         --实现重载方法  
  540.        overriding member function get_info return varchar2 as
  541.        begin
  542.          return '员工编号:' ||self.empno||'员工名称:'||self.person_name||
  543.          '职位:'||self.job;
  544.          end;      
  545.        end;
  546.        
  547. declare
  548.        o_emp employee_personobj;
  549.       begin
  550.         o_emp:=employee_personobj('张小五','F',
  551.            to_date('1983-01-01','yyyy-mm-dd'),'中信',7981,5000,'Programmer');
  552.            dbms_output.put_line(o_emp.get_info);
  553.            dbms_output.put_line(o_emp.get_emp_info);
  554.         end;
  555. --管理对象表
  556. create table emp_obj_table of employee_personobj;
  557. select * from emp_obj_table
  558. drop type employee_personobj;--绑定表之后无法删除对象
  559. create table emp_addr_table of employee_addr;
  560. sql>set desc depth all LINENUM ON   --展开层次结构
  561. desc emp_addr_table;
  562. insert into emp_obj_table values('张小五','F',to_date('1983-01-01','yyyy-mm-dd'),'中信',
  563.       7981,5000,'Programmer' );
  564.       
  565. insert into emp_addr_table values (7369,5000,800,20,
  566.     address_type('玉兰一街','二巷','深圳','DG',523343));
  567. --检索对象表  value函数
  568. select value(e) from emp_obj_table e;
  569. declare
  570.        o_emp employee_personobj;
  571. begin
  572.    select value(e) into o_emp from emp_obj_table e where e.person_name='张小五';
  573.    dbms_output.put_line(o_emp.person_name||'的职位是:'||o_emp.job);
  574.   end;
  575.   
  576.   
  577.   create type address as object(
  578.          street varchar2(35),
  579.          city varchar2(15),
  580.          state char(2),
  581.          zip_code integer
  582.   );
  583.   
  584. create table addresses of address;
  585. create type person as object(
  586.        person_name varchar2(15),
  587.        birthday date,
  588.        home_address ref address, --使用ref关键字,指定属性为指向另一个对象表的对象
  589.        phone_number varchar2(15)
  590. );
  591. create table persons of person;
  592. insert into addresses values(address('玉兰','深圳','GD',''));
  593. insert into addresses values(address('黄甫','广州','GD',''));
  594. insert into persons values (person('王小五', to_date('1983-01-01','yyyy-mm-dd'),
  595. (select REF(a) from addresses a where street='玉兰'),''));
  596. select person_name,deref(home_address) as home from persons
  597.    
  598. --更新对象表
  599. update emp_obj_table empobj set empobj.gender='M'
  600. where empobj.person_name='张小五';
  601. --删除对象表
  602. delete from emp_obj_table where person_name='张小五';
  603. --定义emp_tbl_obj对象类型
  604. create or replace type emp_tbl_obj as object(
  605.        empno number(6),
  606.        ename varchar2(10),
  607.        job varchar2(18),
  608.        mgr number(4),
  609.        hiredate date,
  610.        sal number(7,2),
  611.        comm number(7,2),
  612.        deptno number(2),
  613.        member function get_emp_info 
  614.        return varchar2
  615. ) instantiable  not final;
  616. create or replace type body emp_tbl_obj as
  617.  member function get_emp_info return varchar2 is
  618.   begin 
  619.     return '员工编号:' || self.empno||'员工名称:'||self.ename||'职位:'
  620.      ||self.job;
  621.     end; end;
  622.     
  623.     
  624.     
  625. create view emp_view of emp_tbl_obj with object identifier(empno)
  626. as select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno
  627. from emp e;
  628. --使用对象类型的视图
  629. declare
  630.      o_emp emp_tbl_obj;
  631. begin
  632.   select value(e) into o_emp from emp_view e where empno=7369;
  633.   DBMS_OUTPUT.put_line('员工'||o_emp.ename||' 的薪资为'||o_emp.sal);
  634.   dbms_output.put_line(o_emp.get_emp_info);
  635.   end;     
  636. --查看对象类型   attribute对象属性的个数,final指定对象是否可继承
  637. select type_name,attributes,final,typecode from user_types
  638. where type_name like 'EMP%' and typecode='OBJECT';
  639. --修改对象类型
  640. alter type employee_personobj add attribute mgr number(6) cascade;
  641. --删除sal属性
  642. alter type employee_personobj drop attribute sal cascade;
  643. desc employee_personobj;
  644. --修改对象类型的成员方法
  645. alter type employee_personobj drop member function get_emp_info
  646. return varchar2 cascade;
  647. alter type employee_personobj add member function 
  648. get_employee return varchar2 cascade;
  649. create or replace type body employee_persvarchar2 is....end;
  650. onobj as
  651.  member function get_emmloyee return 
  652. 如果从基类删除一个方法,必须修改覆盖被删除方法的子类
  653. 用alter type的casade选择判断是否有子类被影响
  654. (1)先从子类删除方法 (2)从基类删除方法,然后用不带overriding关键字的
  655. alter type把它重新添加进去
  656.  
  657. ```
  658.  
  659.                

PLSQL面向对象的更多相关文章

  1. SQL记录-PLSQL面向对象

    PL/SQL面向对象 PL/SQL允许定义一个对象类型,这有助于在Oracle的数据库中设计的面向对象.对象类型可以包装复合类型.使用对象允许实现数据的具体结构现实世界中的对象和方法操作它.对象有属性 ...

  2. PLSQL语法深入浅出

    一:PLSQL概览:PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言.PLSQL提供了典型的高级语言特 性,包括封装,例外处理机制,信息隐藏,面向对象等:并把新的编程思想带到了数 ...

  3. oracle client PLSQL配置

    date:20140525auth:Jin platform :windows 一.服务端启动服务和创建账号# su - oracle$ lsnrctl start$ sqlplus / as sys ...

  4. PL-SQL 包的创建和应用

     PL-SQL 包的创建和应用 ①简单介绍     包是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点.是对这些PL/SQL 程序设计元素的 ...

  5. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  6. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  7. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

随机推荐

  1. 使用python来搞定redis的订阅功能

    好久没写博客了.   最近公司开了新项目,我负责的内容之一是系统的后端.具体项目内容我就不介绍了,但是用到的技术有些还是很有趣的,值得记录一下.今天介绍的就是其中一个:利用redis的pubsub订阅 ...

  2. UVa 1642 - Magical GCD(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 1305. [CQOI2009]跳舞【最大流+二分】

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  4. Day10 上传和下载

    上传 将本地文件传输到服务器 jsp:  文件上传的请求方式必须是post  input的type必须是file  enctype="multipart/form-data" ...

  5. gitblit-1.8.0域认证

    gitblit-1.8.0\data\defaults.properties # # DEFAULTS.PROPERTIES # # The default Gitblit settings. # # ...

  6. UITableViewCell的父视图

    最近版本测试阶段,发现一个奇怪的问题,以前在A测试机上出现的崩溃bug,解决后今天在B测试机上又出现了,在B上解决完之后,返回到设备A上发现又不行了.最后调试发现是测试设备系统版本不同导致的,A设备是 ...

  7. 关于mysql中GROUP_CONCAT函数的使用

    偶然看到公司存储过程中有个字符串拼接的函数,改bug过程中使用到了,还挺有用的,于是记录下来方便记忆,帮助有需要的人. 这是我需要整理的串,他是调用了一个存储过程,传入组织机构的id和迭代层数,返回来 ...

  8. 关于MySQL存入的时间和取出时间不一致的解决

    场景:代码运行在Linux-A上,new Date() 生成的时间比当前时间早13个小时,导致存入数据库内的时间也早13个小时,但前台读取展示出来的时间又是正常的.在数据库直接select now() ...

  9. 如何查看PostgreSQL的checkpoint 活动

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL基础知识与基本操作索引页    回到顶级页面:PostgreSQL索引页 作者:高健@博客园 luckyjackgao@g ...

  10. 23-[模块]-logging

    1.日志级别 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志 ...