`

精通Oracle10编程SQL(1-3)PLSQL基础

阅读更多
--只包含执行部分的PL/SQL块
--set serveroutput off
begin
  dbms_output.put_line('Hello,everyone!');
end;


select * from emp;

--包含定义部分和执行部分的PL/SQL块
declare
   v_ename varchar2(5);
begin
   select ename into v_ename from emp
   where empno=&no;
   dbms_output.put_line('雇员名:'||v_ename);
end;


--包含定义部分、执行部分和例外处理部分的PL/SQL块
declare
   v_ename varchar2(5);
begin
   select ename into v_ename from emp
   where empno=&no;
   dbms_output.put_line('雇员名:'||v_ename);
exception
   when NO_DATA_FOUND THEN
       dbms_output.put_line('请输入正确的雇员号!');
end;

select * from emp;

--PL/SQL块分类-匿名块
declare
   v_avgsal number(6,2);
begin
   select avg(sal) into v_avgsal from emp
   where deptno=&no;
   dbms_output.put_line('平均工资:'||v_avgsal);
end;



select * from emp;
select * from dept for update;

--PL/SQL块分类-命名块(具有特定名称标识的PL/SQL块)
--<<outer>>  --在PL/SQL Developer中不可执行
declare
   v_deptno number(2);
   v_dname varchar2(10);
begin
   --<<inner>>  --在PL/SQL Developer中不可执行
   begin
       select deptno into v_deptno from emp where lower(ename) = lower('&name');
   end; --<<inner>>
   select dname into v_dname from dept where deptno = v_deptno;
   dbms_output.put_line('部门名:'||v_dname);
end; --<<outer>>


--子程序-过程
create procedure update_sal(name varchar2,newsal number)
is
begin
  update emp set sal = newsal where lower(ename)=lower(name);
end;

select * from emp;

--exec update_sal('Test',40.5)

select * from emp;

--子程序-函数
create function annual_income(name varchar2)
return number is
   annual_salary number(7,2);
begin
   select sal*12 + nvl(comm,0) into annual_salary
   from emp where lower(ename)=lower(name);
   return annual_salary;
end;

--调用函数
declare
    income number(6,2);
begin
    income:=annual_income('Test2');
    dbms_output.put_line(income);
end;


--子程序-包
create package emp_pkg IS
  PROCEDURE update_sal(name varchar2,newsal number);
  FUNCTION annual_income(name varchar2) return number;
end;


create package body emp_pkg IS
  PROCEDURE update_sal(name varchar2,newsal number)
  is
  begin
      update emp set sal=newsal where lower(ename)=lower(name);
  end;
  function annual_income(name varchar2) return number
  is
     annual_salary number(7,2);
  begin
     select sal*12+nvl(comm,0) into annual_salary from emp where lower(ename)=lower(name);
     return annual_salary;
  end;
end;


select * from emp;

call emp_pkg.update_sal('Test2',1500);


--调用包中的函数
declare
    income number(6,2);
begin
    income:=emp_pkg.annual_income('Test2');
    dbms_output.put_line(income);
end;


--触发器
--触发器update_cascade用于实现级联更新,如果不建立该触发器,那么当更新dept表的deptno列数据时就会显示错误"ORA-02292:违反完整约束条件
--(SCOTT.FK_DEPTNO)-已找到子记录日志";而在建立了该触发器之后,当更新deptno列时,就会级联更新emp表的deptno列的相关数据
create OR REPLACE trigger update_cascade
   after update of deptno ON dept
   for each row
begin
   update emp set deptno=:new.deptno where deptno=:old.deptno;
end;


--使用标量变量
DECLARE
   v_ename VARCHAR2(5);
   v_sal NUMBER(6,2);
   c_tax_rate CONSTANT NUMBER(3,2):=0.03;
   v_tax_sal NUMBER(6,2);
BEGIN
   select ename,sal into v_ename,v_sal from emp where empno=&no;
   v_tax_sal:=v_sal*c_tax_rate;
   dbms_output.put_line('雇员名:'||v_ename);
   dbms_output.put_line('雇员工资:'||v_sal);
   dbms_output.put_line('所得税:'||v_tax_sal);
end;


select * from emp;

--使用%TYPE属性
--变量v_ename,v_sal与EMP表的ename列、sal列的数据类型和长度完全一致,而变量v_tax_sal与变量v_sal的数据类型和长度完全一致。
--这样,当ename列和sal列的类型和长度发生改变时,该PL/SQL块将不需要进行任何修改。
DECLARE
   v_ename emp.ename%TYPE;
   v_sal emp.sal%TYPE;
   c_tax_rate CONSTANT NUMBER(3,2):=0.03;
   v_tax_sal v_sal%TYPE;
BEGIN
   select ename,sal into v_ename,v_sal from emp where empno=&eno;
   v_tax_sal:=v_sal*c_tax_rate;
   dbms_output.put_line('雇员名:'||v_ename);
   dbms_output.put_line('雇员工资:'||v_sal);
   dbms_output.put_line('所得税:'||v_tax_sal);
end;


select * from emp for update;

--复合变量-PL/SQL记录
--emp_record_type是PL/SQL记录类型,并且该PL/SQL记录类型包含了三个成员(name,salary,title);emp_record是记录变量;
--emp_record.name则表示引用记录变量emp_record的成员name.
declare
   type emp_record_type is record(
        name emp.ename%TYPE,
        salary emp.sal%TYPE,
        title emp.job%TYPE);
   emp_record emp_record_type;
begin
   select ename,sal,job into emp_record from emp where empno=7788;
   dbms_output.put_line('雇员名:'||emp_record.name);
end;

--复合变量-PL/SQL表
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=7788;
   dbms_output.put_line('雇员名:'||ename_table(-1));
end;


--复合变量-嵌套表
create or replace type emp_type as object(
   name varchar2(10),salary number(6,2),
   hiredate date);
   
create or replace type emp_array is table of emp_type;

--使用嵌套表类型作为表列时,必须要为其指定专门的存储表,如下所示
create table department(
   deptno number(2),dname varchar2(10),
   employee emp_array
)nested table employee store as employee;


--复合变量-VARRAY
--VARRAY(变长数组)类似于嵌套表,它可以作为表列和对象类型属性的数据类型。
--但需要注意,嵌套表的元素个数没有限制,而VARRAY的元素个数是有限制的。
--注意:嵌套表列数据需要存储在专门的存储表中,而VARRAY数据则与其他数据一起存放在表段中。
create type article_type as object(
   title varchar2(30),pubdate date
);

create type article_array is varray(20) of article_type;

create table author(
   id number(6),name varchar2(10),article article_array
);


select * from emp;

--参照变量-REF CURSOR
DECLARE
  TYPE cl IS REF CURSOR;
  emp_cursor cl;
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  OPEN emp_cursor FOR
     select ename,sal from emp where deptno = 3;
  loop
     fetch emp_cursor into v_ename,v_sal;
     exit when emp_cursor%NOTFOUND;
     dbms_output.put_line(v_ename);
  end loop;
  close emp_cursor;
end;


--参照变量-REF obj_type
create or replace type home_type as object(
   street varchar2(50),city varchar2(20),
   state varchar2(20),zipcode varchar2(6),
   owner varchar2(10)
);

create table homes of home_type;

insert into homes values('呼伦北路12号','呼和浩特','内蒙','010010','马鸣');
insert into homes values('呼伦北路13号','呼和浩特','内蒙','010010','秦斌');
commit;

select * from homes

--对象表homes存放着家庭所在地以及户主姓名。
--为了使得同一家庭的每个家庭成员可以共享家庭地址,可以使用REF引用home_type对象类型,从而降低占用空间。
create table person(
   id number(6) primary key,
   name varchar2(10),addr ref home_type
);

select * from person;

insert into person select 1,'马嗣',ref(p) from homes p where p.owner='马鸣';
insert into person select 2,'马真',ref(p) from homes p where p.owner='马鸣';
insert into person select 3,'王敏',ref(p) from homes p where p.owner='马鸣';

commit;

 

分享到:
评论

相关推荐

    精通oracle 10g plsql 编程-学习笔记

    ### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...

    精通Oracle10g PlSQL编程-2

    精通Oracle10g PlSQL编程-2

    精通Oracle10g PlSQL编程-1

    精通Oracle.10g.Pl.SQL编程

    精通Oracle10g PLSQL编程.rar

    在"精通Oracle10g PLSQL编程"的资料中,你将深入学习到如何有效地使用这一语言进行数据库管理和应用开发。 1. **PLSQL基础** - **变量和数据类型**:理解PLSQL中的基本数据类型,如NUMBER、VARCHAR2、DATE等,并...

    精通Oracle 10g PLSQL编程

    Oracle 10g PLSQL编程是数据库管理员和开发人员必须掌握的关键技能之一。PL/SQL,全称为...在实际工作中,不断优化和调整代码,以适应不断变化的业务需求,是成为一名精通Oracle 10g PLSQL编程专家的必经之路。

    精通Oracle PLSQL编程

    通过阅读《精通Oracle PLSQL编程》这本书,你将有机会掌握这些核心概念,并逐步成为一个熟练的Oracle数据库开发者。书中的实例和练习将帮助你更好地理解和应用这些技术,为你的职业生涯打下坚实的基础。

    精通Oracle 10g SQL和PL/SQL

     本书是专门为oracle开发人员而提供的编程指南 通过学习本书 读者不仅可以掌握编写sql语句和pl/sql块的基础知识 而且还可以掌握sql高级特征 正则表达式 flashback查询 merge语句 sql:1999连接 和pl/sql高级特征 ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    精通Oracle.10g.PLSQL编程

    br&gt;精通Oracle 10g PL/SQL编程 &lt;br&gt; 【作 者】王海亮 林立新 于三禄 郑建茹 【丛 书 名】 万水Oracle技术丛书 &lt;br&gt;http://images.china-pub.com/ebook20001-25000/21975/shupi.jpg&lt;br&gt;&lt;br&gt;PL/SQL是...

    精通PLSQL编程.pdf

    通过上述内容可以了解到,《精通Oracle 10g PL/SQL编程》是一本全面覆盖PL/SQL基础知识和高级开发技术的教程,无论是作为新入门的参考资料还是资深开发者的工具书,都具有重要的价值。书中所涉及的内容不仅限于基础...

    精通Oracle 10g PLSQL编程.pdf

    本书《精通Oracle 10g PL/SQL编程》深入浅出地介绍了PL/SQL的基础和高级特性,旨在帮助读者掌握这一强大的数据库编程工具。 首先,PL/SQL是Oracle数据库提供的内置编程语言,它将SQL语句与过程编程语言(如PASCAL或...

    精通OraclePl.SQL编程.pdf

    精通OraclePl.SQL编程.pdf

    精通Oracle10g SQL/PL编程.PDF

    《精通Oracle10g SQL/PL编程》是一本专为数据库开发者和管理员设计的专业书籍,旨在深入探讨Oracle10g数据库管理系统中的SQL和PL/SQL编程技术。这本书以通俗易懂的方式,为初学者提供了全面的学习路径,同时也为有...

    美河提供精通Oracle.10g.Pl.SQL编程附源码和帮助文件.rar

    2010-10-23 13:15 &lt;DIR&gt; . 2010-10-23 13:15 &lt;DIR&gt; .. 2010-10-23 12:45 &lt;DIR&gt; 01美河提供Pl.SQL 2010-10-23 13:15 &lt;DIR&gt; 02SQLPLUS_Help 2010-10-23 13:15 &lt;DIR&gt; 02自己写的一些试验...精通Oracle.10g.Pl.SQL编程.pdf

    精通Oracle10编程.pdf

    通过以上几个方面的介绍,我们可以看到“精通Oracle10编程.pdf”这一资料中涉及的知识点主要包括:Oracle 10g的基础介绍、嵌套表类型的应用、引用变量的声明、游标的使用以及变量命名规则等方面。这些内容对于深入...

    《精通Oracle10gPLSQL编程》教程全书PDF,非常不错的教程。

    Oracle 10g PL/SQL编程是数据库管理和开发领域中的重要技能,这本《精通Oracle10g PLSQL编程》教程全面深入地介绍了这一技术。PL/SQL是Oracle数据库系统中用于处理数据的编程语言,它结合了SQL的查询功能与传统编程...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    精通Oracle 10g plsql编程

    《精通Oracle 10g PL/SQL编程》一书涵盖了Oracle数据库系统中PL/SQL语言的全面知识,旨在帮助读者不仅能够熟练掌握基础的PL/SQL编程,而且深入理解其高级特性和开发技巧。PL/SQL是Oracle数据库的内置过程式编程语言...

    精通Oracle10g/PLSql编程

    《精通Oracle10g/PLSql编程》这本书深入浅出地介绍了Oracle数据库系统与PL/SQL编程语言,是初学者入门和进阶的宝贵资源。Oracle10g是Oracle数据库的一个重要版本,它提供了许多增强的功能和优化,使得数据管理更为...

Global site tag (gtag.js) - Google Analytics