PL/SQL编程基本概念

简介: PL/SQL编程基本概念
/*
=============================================================================
                        pl/sql编程
=============================================================================
*/
--pl/sql块的结构
declare 
  --声明部门:在此声明pl/sql用到的变量、类型以及游标,以及局部的存储过程和函数
begin
  --执行部分:过程及sql语句,即程序的组成部分
exception 
  --异常处理部分:错误处理
end;
--例子
create table toys
(
id number(20),
name varchar2(50),
price number(5,2),
sal_date date
)
insert into toys values(1,'张三',525,sysdate)
insert into toys values(2,'李四',525,'2016-05-06');
select * from toys;
declare 
  v_name varchar2(20);
  v_price number;
begin
   select name,price into v_name,v_price from toys where id=1;
   dbms_output.put_line('名字:'||v_name||',价格'||v_price);
end;
10
/*
type和rowtype
-------------------------------------------------
*/
declare 
  -- v_name varchar2(25);
  -- v_name1 toys.name%type;   --返回一个
   v_name1 toys%rowtype;  --返回多个
   e_ronull exception;--声明异常
begin 
  select * into v_name1 from toys where id=1;
  dbms_output.put_line('名字:'||v_name1.name);
exception 
  when dlp_val_on_index then
  dbms_output.put_line('将重复键插入id列');
end;
--税点
declare 
v_start constant number:=3500;   --声明常量
begin
--sql语句
end
--常量和变量的声明
  变量名称 pl/sql的数据类型(大小):=init_value;
eg:variable_name constant data_type:=value;
--应用实例
declare 
    v_ename varchar2(20);
    v_rate number(7,2);
    c_rate_incr constant number(7,2):=1.10;
begin
    --方法一:通过select into 赋值
    select ename,sal* c_rate_incr into v_ename,v_rate from employee where empno='7788';
    --方法二:通过赋值操作符“:=”给变量赋值
    v_ename:='scott';
end;
--使用序列赋值
    v_no:=emp_seq.nextval;
----------------------实例2---------------------------------
--根据员工编号查询员工信息
declare 
    v_empno employee.empno%type:=4;
    v_rec employee%rowtype;
begin
    select * into v_rec from employee where empno=v_empno;
    dbms_output.put_line
           ('姓名:'||v_rec.ename||'工资:'||v_rec.sal||'工作时间:'||v_rec.hiredate);
end;
--==执行成功之后,输出:姓名:张四工资:10000工作时间:2017-02-02 00:00:00
/*
----------------------pl/sql控制语句--------------------------------
*/
--if的语法
if <布尔表达式> then
   pl/sql和sql语句
end if;
------------------------
if<布尔表达式> then
   pl/sql和sql语句
else
   其他语句
end if;
-------------------------
if <布尔表达式> then
   pl/sql语句和sql语句
elsif <其他布尔表达式> then
   其他语句
elsif <其他布尔表达式> then
   其他语句
else
   其他语句
end if;
----注意:是elsif  不是elseif
------------------------------case的语法--------------------------
-------格式一------
case 条件表达式
     when 条件表达式结果1 then
        语句段1
     when 条件表达式结果2 then
         语句段2
     when 条件表达式结果n then
         语句段n
     [else语句段]
end case;
-------格式二------
case
     when 条件表达式1 then
         语句段1
     when 条件表达式2 then
         语句段2
     when 条件表达式n then
         语句段n   
else 语句段
end case;
------------------------------循环控制--------------------------
loop 
    要执行的语句;
    exit when <条件语句>  --条件满足时,退出循环语句
end loop;
---while循环语句的语法
while <布尔表达式> loop 
    要执行的语句;
end loop;
--for循环语句的语法
for 循环计数器 in [reverse] 下限 ...上限 loop
    要执行的语句
end loop;
------------------------------实例3-------------------------
declare 
   v_counter number:=5;
begin
    dbms_output.put_line('v_counter的当前值为:'||v_counter);
    if v_counter>=10 then
       null;--为了使语法变得有意义,去掉null会报语法错误
   else
      v_counter:=v_counter+10;
      dbms_output.put_line('v_counter 的改变值为:'||v_counter);
   end if;
   end;
   
   
--========执行成功之后输出:v_counter的当前值为:5   v_counter 的改变值为:15
/*
  =======================异常处理机制===============================
*/
--语法
begin 
    sequence_of_statements;
exception 
    when <exception_name> then
         sequence_of_statements;
     when others then
         sequence_of_statements;
end;
----------------------------实例4------------------------------------
--查询编号为7788的雇员的福利补助(comm列)
declare 
    v_comm employee.comm%type;
    e_comm_is_null exception ;--定义异常类型变量
begin 
    select comm into v_comm from employee where empno=7788;
    if v_comm is null then
       raise e_comm_is_null;
    end if;
exception 
    when no_data_found then
       dbms_output.put_line('雇员不存在!错误为:'||sqlcode||sqlerrm);
    when e_comm_is_null then
       dbms_output.put_line('该雇员无补助');
    when others then 
       dbms_output.put_line('出现其他异常!');
    end;
----================测试运行结果:雇员不存在!错误为:100ORA-01403: 未找到任何数据
--自定义异常
raise_application_error(error_number,error_message);
--实例
declare 
  ....
  begin 
  ....
  if v_com is null then
     raise_application_error(-20001,'该雇员无补助');
     end if;
end;
/*
====================================显示游标================================
*/
--1.声明游标
cursor cursor_name [(parameter [,parameter]...)]
[return return_type] is select_statement;
--2.打开游标
open cursor_name[(parameters)];
--3.提取游标
fetch cursor_name into variables;
--4.关闭游标
close cursor_name;
--------------------实例6------------------------
declare 
   name employee.ename%type;
   sal employee.sal%type;   --定义两个变量来存放ename和sal的内容
   cursor emp_cursor is select ename,sal from employee;
begin
   open emp_cursor;
   loop
        fetch emp_cursor into name,sal;
        exit when emp_cursor%notfound;
        dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员:'||name|| 'oooo' || sal);
    end loop;
    close emp_cursor;
end;
--===执行成功输出:
/*
第1个雇员:张一3000
第2个雇员:张二5000
第3个雇员:张三8000
第4个雇员:张四10000
第5个雇员:张五6300
*/
--使用显示游标删除或者更新
cursor cursor_name id select_statement for update [of columns];
--在使用for update 子句声明游标时,可以使用下面语法更新行
update table_name set column_name=column_value where current of cursor_name;
--根据编号查询雇员的姓名
declare 
       v_ename varchar2(20);
begin
  select ename into v_ename from employee where empno=&empno;
  dbms_output.put_line('雇员的名字是:'||v_ename);
end;
select * from employee;


目录
相关文章
|
11天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
11天前
|
SQL Perl
PL/SQL经典练习
PL/SQL经典练习
15 0
|
11天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(五):PL/SQL编程
【Oracle】玩转Oracle数据库(五):PL/SQL编程
67 8
|
6天前
|
SQL 分布式计算 关系型数据库
Spark编程实验三:Spark SQL编程
Spark编程实验三:Spark SQL编程
18 1
|
11天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
11天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
11天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
11天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
11天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
11天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。