oracle的笔记,凑合着看吧!4.PL/SQL

来源:互联网 发布:myhome3d装修设计软件 编辑:程序博客网 时间:2024/05/16 11:19

PL/SQL是SQL的补充语言,相当于数据库内置的一种语言,用于写存储过程与触发器;
拥有功能:块结构,变量和类型,条件逻辑,循环,游标,保存查询返回结果,sql函数,存储过程,包;   
    
     1.存储过程:就是带有名字的PL/SQL的程序块,创建后可以直接调用,仅此而已;
           语法:create or replace procedure 存储过程名(参数) is ..PL/SQL....
               //如果没有此名字就建立,有就替换;replace 替换
               //参数格式:变量名 in/out 类型,默认是in
           调用: exec  存储过程名;
    
     2.函数:相当于java的方法,拥有返回值;用户自己调用
    
        
    特殊数据类型:%type , %rowtype, sqi%rowcount(影响了多少行);
   
    注: PL/SQL中使用select语句,此select语句必须有返回的记录并且还必须只有一条,不然报错,记得要有into;
         PL/SQL中使用增删改的语句,后面跟随一个commit;
         PL/SQL中使用建表语句,格式为:execute immediate '建表语句';
        例如:   
            declare
             name emp.sal%type;
             v_sal emp%rowtype;
             //相当于表对应的类的类型
            begin
             name := 2450;
             select * into v_sal  from emp where sal = name;
             //into是最重要的,呵呵,他是注入变量的;
             dbms_output.put_line(v_sal.ename);
            end;
           
       
   
    他分为四个部分declare(可省略), begin, exception, end
    普通:
        1.简单输出'你好'的方法:
            set serveroutput on;
            //将内置的环境变量serveroutput设置为on,默认是off(不输出),
            begin
                  dbms_output.put_line('你好');
            end;
       
        2.声明有变量的输出:
            set serveroutput on;
            declare
                name varchar2(20);
                //声明变量;
                sex    emp.ename%type;
                //此变量随着emp.ename字段的类型;
            begin
             name := 'wang';
             //赋值,注意是赋值是':='
                      dbms_output.put_line(name);
            end;
           
        3.有异常的写法:
            set serveroutput on;
            declare
                name number(3,0);
            begin
                 name := 2/0;
                 dbms_output.put_line(name);
            exception
                when others then
                //任何异常都执行以下操作;
                dbms_output.put_line('错误'||'wang');
                //相当于Java中'错误'+'wang'
            end;
           
       
        复合变量,就是自定义的变量类型,分别是table, record ;
           
            table :
           
                语法: type 变量名 is table of 数据类型 index by 数据类型;
           
                table有点类似于数组的数据类型,具体看例子吧:
                   
                    set serveroutput on;
                    declare
                     type type_table_stt is table of number(4,0) index by binary_integer;
                     //type:声明是定义复合类型, index by binary_integer :下标为binary_integer类型;
                     name type_table_stt;
                    begin
                      name(0) := 12;
                      name(1) := 123;
                      name(-1) := 3;
                      bms_output.put_line(name(0));
                    end;
           
            record :
           
                语法: type 变量名 is record ( 声明变量);
               
                record 是有点类似于java中的类的,可以他内部声明属性;
               
                例子:
                    declare
                         type type_record_stt is record (
                           name varchar2(10),
                           sex varchar2(10)
                         );
                         name type_record_stt;
                    begin
                        name.name := '12';
                        name.sex := 'wang';
                        dbms_output.put_line(name.sex);
                     end;