天天看点

Oracle PL/SQL 编程基础 实例

create table mytest(name varchar(20),password varchar(30));

create or replace procedure sp_pro2 is 

begin 

insert into mytest values(‘fc‘,‘123‘);

end;

查看错误信息

show error

如何调用该过程:

1, exec 过程名 (参数,。。)

2.  call 过程名 (参数  )

set server output on

dbms_output.put_line(‘helloe‘);

---------------------

declare 

  v_ename varchar(20);

    select ename into v_ename from emp where empno=&aa;

  dbms_output.put_line(‘姓名:‘||v_ename);

  end;

  -----------

  create procedure sp_pro3 (spName varchar2,newSal number) is

  begin  

                          --执行部分

     update emp set sal=newSal where ename=spName;

     end;

     --dioyong 

     call sp_pro3(‘scott‘,‘8000‘);

 --------------函数 -------

    CREATE or replace  function sp_fun1(spName varchar2) return 

    number is yearsal number(7,2);

     begin select sal*12+nvl(comm,0) into yearsal from emp 

       where ename=spName;

       return yearsal;

       end;

    --diaoyong

    var abc number;

    call sp_fun1(‘SCOTT‘) into : abc;

    ---------------------------

   -------包------------由包规范和包体组成的

   --创建一个包sap_pack1 

   --声明该包有一个过程和一个函数

   create or replace package sp_pack1 is

     procedure update_sal(spName varchar2,newsal number);

     function  annual_income(spName varchar2) return number;

     --创建包体---

         create or replace package body sp_pack1 is

         procedure update_sal(spName varchar2,newsal number) is

     begin  

     update emp set sal=newsal where ename=spName;

      function   annual_income(spName varchar2) return number

           is yearsal number(7,2);

     begin   select sal*12+nvl(comm,0) into yearsal from emp 

    end;

 ---调用 ----

        call sp_pack1.update_sal(‘SCOTT‘,9000);

----------定义并使用变量---================================

     --  标量类型 scalar 

      v_ename varchar(10);

      v_sal  number(6,2):=5.4

      v_data date;

      v_valid  boolean not null default false;

                       ---输入员工号,显示 name sal tax

                       declare 

                         v_tax_rate number (3,2):=0.03;

                       -- v_ename varchar2(5);

                         v_ename  emp.ename%type;

                        -- v_sal  number(7,2);

                         v_sal  emp.sal%type;

                          v_tax_sal number (7,2);

                       begin  

                           select ename,sal into v_ename,v_sal from emp where empno=&no;

                           --计算所得税 

                             v_tax_sal:=v_sal*v_tax_rate;

                           --输出

                            dbms_output.put_line(‘name:‘||v_ename||‘工资‘||v_sal  ||‘交税:‘||v_tax_sal);

                           end;

--复合类型  composite

      ----pl/sql 记录  类似于高级语言的结构体 

              --定义一个plsql 记录类型  emp_record_type

                  declare

                type   emp_record_type is record (aname emp.ename%type,salary emp.sal%type,title emp.job%type);

                --定义了一个 变量 sp_record  这个变量的类型是emp_record_type                                                                           

                  sp_record emp_record_type;

               begin 

                 select ename,sal,job into  sp_record from  emp where empno=7788;

               dbms_output.put_line(‘员工名:‘||sp_record.aname);

               end;

      --------pl/sql  表  相当于该机语言里的数组 

            --定义一个plsql 表类型  emp_table_type   

                  declare 

                  type emp_table_type is table  of emp.ename%type index by  binary_integer;

                    sp_table emp_table_type;

                  begin 

                     select ename into  sp_table(0)  from emp where empno=7788;

                     dbms_output.put_line(‘员工名--》‘||sp_table(0)); 

                  end;

--参照类型

        ---1游标变量

               --实例一  输入部门号,显示所有的员工姓名和他的工资

                       declare

                             --定义游标类型

                             type sp_emp_cursor is ref cursor;

                              --定义游标变量

                             test_cursor sp_emp_cursor; 

                             --定义变量

                             v_ename emp.ename%type;

                             v_sal emp.sal%type;

                         begin 

                              --执行

                              --把test_cursor 和select 结合

                            open test_cursor for select ename,sal  from emp where deptno=&depno;

                            --循环取出

                            loop

                              fetch test_cursor into v_ename,v_sal;

                              --判断是否test——cursor 为空

                               exit when  test_cursor%notfound;

                              dbms_output.put_line(‘员工名->‘||v_ename||‘工资->‘||v_sal); 

                            end loop;

                         end;