zoukankan      html  css  js  c++  java
  • 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;
    
    
     
    

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/a1111/p/12816388.html
Copyright © 2011-2022 走看看