`
gshxsyq
  • 浏览: 20762 次
社区版块
存档分类
最新评论

PL/SQL学习笔记

阅读更多

--设置屏幕输出为on,即在屏幕上显示相应的输出。
SQL> set serveroutput on;
--dbms_output.put_line();相当于Java中的System.out.println();
SQL> begin
 
dbms_output.put_line('hello!');
 
end;
 
/
 

--PL/SQL 中声明变量用declare ,变量名在前,类型在后;约定俗成的变量命名以“V_”开头
SQL> declare
 
v_name varchar2(10);
 
begin
 
v_name := 'myname';
 
dbms_output.put_line(v_name);
 
end;
 
/
 

 
declare
 
v_num number := 0;
 
begin
 
v_num = 2/v_num;
 
dbms_output.put_line(v_num);
 
exception
 
when others then
 
dbms_output.put_line('error!');
 
end;
 
/
 
--变量声明,使用%type属性
 
  declare
 
  v_empno number(4);
 
  v_empno2 emp.empno%type;
 
  v_empno3 v_empno2%type;
 
 
 
 
--Table变量类型 即相当于Java中的数组类型
declare
--声明类型type_table_emp_empno是一个table类型,里边存放的是emp表中的empno类型的数据,用binary_integer类型的索引;该类型的变量的下标可以是负数。
 
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
 
--定义变量v_empnos 是上面声明的类型
 
v_empnos type_table_emp_empno;
 

--Record变量类型,相当于Java中的类
declare
 
type type_record_dept is record --声明类型type_record_dept 是一个record
 
  {
 
    deptno dept.deptno%type,
 
    dname dept.dname%type,
 
    loc dept.loc%type
 
  };
 
v_temp type_record_dept;  --定义变量v_temp是上面声明的type_record_dept类型的
 
begin
 
  v_temp.deptno := 50;
 
  v_temp.dname :='aaa';
 
  v_temp.loc := 'BJ';
 
  dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname);
 
end;
--使用%rowtype声明record变量
declare
 
v_temp dept%rowtype; --声明变量v_temp为 dept 整张表的行结构,当dept的表结构发生变化的时候该变量则跟着发生相应的变化
 
begin
 
  v_temp.deptno := 50;
 
  v_temp.dname :='aaa';
 
  v_temp.loc := 'BJ';
 
  dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname);
 
end;
 

--SQL语句的运用
declare
 
v_ename emp.ename%type;
 
v_sal emp.sal%type;
 
begin
 
--用select语句时必须要有返回值,并且返回值只能有一条
 
  select ename,sal into v_ename,v_sal from emp where empno = 7369;
 
  dbms_output.put_line(v_ename);
 
end;
 

declare
 
v_deptno dept.deptno%type :=50;
 
v_name dept.dname%ytpe :='aaa';
 
v_loc dept.loc%type := 'BJ';
 
begin
 
  insert into dept2 values(v_deptno ,v_dname,v_loc);
 
  commit;
 
end;
--PL/SQL中执行DDL语句需要在前面加上execute immediate 语句
 
begin
 
  execute immediate  'create table t (nnn varchar2(10) default ''aaa'' )'; --用两个单引号对DDL语句中的单引号进行转义
 
end;
 

--if语句
--取出7369的薪水,如果<1200,则输出'low',如果<200则输出'middle',否则'high'
declare
 
v_sal emp.sal%type;
 
begin
 
  select sal into v_sal from emp where empno = 7369;
 
  if(v_sal <1200) then
 
    dbms_output.put_line('low');
 
    elsif (v_sal < 2000) then
 
      dbms_output.put_line('middle');
 
      else
 
        dbms_output.put_line('high');
 
  end if;
 
end;
 

--PL/SQL中的循环
declare
 
i binary_integer :=1;
 
begin --相当于do..while循环
 
  loop
 
    dbms_output.put_line(i);
 
    i := i+1;
 
    exit when (i>=11);
 
  end loop;
 
end;
 

declare
 
j binary_integer :=1;
 
begin
 
  while j<11 loop
 
    dbms_output.put_line(j);
 
    j := j+1;
 
  end loop;
 
end;
 

begin
 
for k in 1..10 loop
 
  dbms_output.put_line(k);
 
end loop;
 
--从1到10倒序循环
 
for k in reverse 1..10 loop
 
  dbms_output.put_line(k);
 
end loop;
end;

--错误处理
declare
 
v_empno emp.empno%type;
 
begin
 
  select empno into v_empno from emp where deptno=10;
 
  exception
 
    when too_many_rows then
 
      dbms_output.put_line('太对记录了');
 
    when others then
 
      dbms_output.put_line('error!');
 
end;
 
 
--错误日志的记录
create table errlog
(
 
id number primary key,
 
errcode number,
 
errmsg varchar2(1024),
 
errdate date
)
create sequence seq_errlog_id start with 1 increment by 1; --创建errlog表的递增序列

declare
 
v_deptno dept.deptno%type := 10;
 
v_errcode number;
 
v_errmsg errlog.errmsg%type;
 
begin
 
  delete from dept where deptno = v_deptno;
 
  commit;
 
exception
 
  when others then
 
    rollback;
 
    v_errcode := SQLCODE;
 
    v_errmsg :=SQLERRM;
 
    insert into errlog values (seq_errlog_id.nextval,v_errcode,v_errmsg,sysdate);
 
    commit;
 
end;
 

--PL/SQL中cursor(游标)的使用 
游标有四个属性:isopen、notfound、found、recount
declare
 
cursor c is
 
  select * from emp;
 
v_emp c%rowtype;
 
begin
 
  open c;
 
  fetch c into v_emp;
 
  dbms_output.put_line(v_emp.ename);
 
  close c;
 
end;
 

--游标配合循环的运用
 
declare
 
cursor c is
 
  select * from emp;
 
v_emp c%rowtype;
 
begin
 
  open c;
 
  loop
 
    fetch c into v_emp;
 
    exit when (c%notfound);
 
    dbms_output.put_line(v_emp.ename);
 
  end loop; 
 
  close c;
 
end;
--用while循环的实现
 
declare
 
cursor c is
 
  select * from emp;
 
v_emp c%rowtype;
 
begin
 
  open c;
 
  fetch c into v_emp;
 
  while(c%found) loop
 
    dbms_output.put_line(v_emp.ename);
 
    fetch c into v_emp;
 
  end loop; 
 
  close c;
 
end;
 
 
--用for循环的实现
declare
 
cursor c is
 
  select * from emp;
 
begin
 
  for v_emp in c  loop
 
    dbms_output.put_line(v_emp.ename);
 
  end loop;
 
end;
--带参数的游标的实例: 

declare
 
cursor c(v_deptno emp.deptno%type,v_job emp.job%type) is
 
  select ename,sal from emp where deptno = v_deptno and job = v_job;
 
begin
 
  for v_emp in c(30,'CLERK')  loop
 
    dbms_output.put_line(v_emp.ename);
 
  end loop;
 
end;
 

--可更新的游标
declare
 
cursor c  is select * from emp2 for update;
 
begin
 
  for v_temp in c loop
 
    if(v_temp.sal < 2000) then
 
      update emp2 set sal = sal *2 where current of c;
 
      elsif (v_temp.sal = 5000) then
 
        delete from emp2 where current of c;
 
    end if ;
 
  end loop;
 
  commit;
 
end;
 

 

--存储过程
create or replace procedure p
 
is
 
cursor c  is select * from emp2 for update;
 
begin
 
  for v_temp in c loop
 
    if(v_temp.sal < 2000) then
 
      update emp2 set sal = sal + 20 where current of c;
 
      elsif (v_temp.sal = 5000) then
 
        update emp2 set sal = sal + 50 where current of c;
 
        else
 
          update emp2 set sal = sal +30 where current of c;
 
    end if ;
 
  end loop;
 
  commit;
 
end;
 

--运行过程的命令如下;
execute p;
或者
begin
 
p;
end;

--创建带参数的存储过程
create or replace procedure p
 
(v_a in number,v_b in number,v_c out number,v_d in out number)
 
is
 
begin
 
  if(v_a > v_b) then
 
    v_c := v_a;
 
    else
 
      v_c := v_b;
 
  end if ;
 
  v_d := v_d +1;
 
end;
--调用带参数的过程的实例:
declare
 
v_a number := 3;
 
v_b number := 4;
 
v_c number;
 
v_d number := 5;
 
begin
 
    p(v_a,v_b,v_c,v_d);
 
    dbms_output.put_line(v_c);
 
    dbms_output.put_line(v_d);
 
    end;
 

--函数
create or replace function sal_tax
 
(v_sal number)
 
return number
 
is
 
begin
 
  if(v_sal < 2000) then
 
    return 0.1;
 
    elsif(v_sal <2750) then
 
      return 0.15;
 
      else
 
        return 0.20;
 
  end if ;
 
end;
--创建函数后调用同其他函数一样,例如:
select sal_tax(sal) , lower(ename) from emp;

--触发器
create table emp2_log
(
uname varchar2(20),
action varchar2(10),
atime date
);
--创建触发器
create or replace trigger trig
 
after insert or delete or update on emp2 for each row
 
begin
 
  if inserting then
 
    insert into emp2_log values (USER,'insert',sysdate);
 
    elsif updating then
 
      insert into emp2_log values (USER ,'update' ,sysdate);
 
      elsif deleting then
 
        insert into emp2_log values(USER,'delete',sysdate);
 
  end if;
 
end;
 

--创建一触发器,解决当你执行update dept set deptno = 99 where deptno = 10;时,会报emp表中已经有相应的引用的错 

create or replace trigger trig
 
after update on dept  for each row
 
begin
 
  update emp set deptno = :NEW.deptno where deptno =:OLD.deptno;
 
end;
--当执行一条语句时既检查约束条件也触发相应的触发器,则相应的触发器先被触发!

分享到:
评论

相关推荐

    pl/sql学习笔记

    以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...

    PL/SQL学习笔记4

    ### PL/SQL学习笔记4 —— 集合与成员函数 #### 一、PL/SQL 表(索引表) 在PL/SQL中,**索引表**(也称为**PL/SQL表**)是一种非常有用的结构,它类似于数组但具有更多的灵活性。这种表是非持久化的,即它们不会...

    我的PL/SQL学习笔记(一)

    在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...

    PL/SQL学习笔记6

    在PL/SQL编程中,游标是处理查询结果集的重要工具。它们允许程序逐行处理结果,而不是一次性加载所有数据,这对于大型数据集尤其有用,因为它可以节省内存并提高性能。下面将详细解释游标的基本概念、分类以及如何在...

    sql,PL/SQl学习笔记

    本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...

    PL/SQL学习笔记7

    在PL/SQL编程中,存储过程和函数是关键的组件,它们允许我们将可重用的代码逻辑存储在数据库中,以便于管理和调用。本文主要探讨了存储过程、函数以及程序包的概念,特点,创建方法,执行方式,权限管理以及参数处理...

    pl/sql数据库学习笔记

    PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...

    PL/SQL学习教程,附笔记

    在学习PL/SQL的过程中,理解这些基本概念和结构是至关重要的。通过实践编写存储过程、函数和触发器,你可以逐渐掌握PL/SQL的强大功能,并利用它来解决实际的数据库编程问题。对于初学者来说,循序渐进、结合实例学习...

    PL/SQL学习笔记5

    在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。

    PL/SQl超级笔记

    总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...

    PL/SQL听课笔记

    ### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...

    pl/sqle学习笔记

    ### PL/SQL 学习笔记知识点详解 #### 1. PL/SQL 基本结构 - **DECLARE**: 在此部分声明变量、常量、数据类型及游标。 - **BEGIN**: 主程序体开始,可以包含任何合法的PL/SQL语句。 - **EXCEPTION**: 异常处理部分,...

    oracle/SQL和PL/SQL课堂笔记

    这篇课堂笔记主要涵盖了基础的SQL查询语法和部分PL/SQL概念。 首先,SQL查询的基础是从数据库中选择数据。`SELECT`语句用于指定需要选取的列,如`SELECT ename, sal, job FROM emp;`。字段顺序可以自由调整,例如`...

    oraclePL/SQL精华笔记

    此文档由个人总结快速学习pl/sql的案例及说明,也是快速查询pl、sql开发的精华文档,在此提供给大家学习与查阅

Global site tag (gtag.js) - Google Analytics