Oracle存储过程的调用

菜鸟一枚,记录学习过程中遇到的问题和解决办法。

统计表数据个数

create or replace procedure prm_example
is 
   n_number number;
   begin
  select count(*) into n_number from emp;
  dbms_output.put_line(n_number);
  end;

这里n_number是定义的一个变量,number代表数字类型,其他例如varchar,date等类型

执行

begin 
     prm_example;
     end;

打印当前时间,简单测试

 create or replace procedure prm_example
is 
   datenow date;
   
   begin
  select sysdate into datenow from dual;
  dbms_output.put_line(datenow);
  end;

dbms_out.put_line()是一个打印变量值的方法,效果如下

Oracle存储过程的调用_第1张图片

执行一个查找字段的方法

create or replace procedure prc_example(de in varchar,name out varchar,App_Code out varchar,error_Msg out varchar)
  as
   begin
    select dname into name from dept where deptno=de;
     exception  when others then
       App_Code:=-1;
       error_Msg:='未找到数据';
      end;

和普通sql不一样的是,这里使用了into字段,对name进行了赋值。假如未找到数据,会抛出异常,将异常抓住,给两个出参赋值。

其实存储过程简单理解为就是一个函数,把一堆sql操作集成到一起,一次执行,

de 代表入参,类似于函数的参数,name,app_code,error_meg代表出参,类似返回值。

写语句测试

   declare
       de varchar(10);
       ab varchar(10);
       appcode varchar(20);
       ermg varchar(20);
       begin
         de:=10;
         prc_example(de,ab,appcode,ermg);
        dbms_output.put_line(ermg);
         end;

这里:=是赋值符号

结果

Oracle存储过程的调用_第2张图片

 第二种测试,先找到存储过程

右键选择test

Oracle存储过程的调用_第3张图片

给入参写值,按F8执行,这里我的入参是10,执行结果如下

Oracle存储过程的调用_第4张图片

因为进行了异常处理,假如没有找到数据,那么,会给后面两个出参赋值,效果图

插入两张表操作

      
create or replace procedure prm_example(do1 in number ,dn1 in varchar,eo1 in number,en1 in varchar ,App_Code out varchar,error_Msg out varchar)
as
begin
insert into dept(deptno,dname) values (do1,dn1);
insert into emp(empno,ename,deptno) values(eo1,en1,do1);

commit;
exception when others then
App_Code:=-1;
error_Msg:='插入失败';
end;

注意,在写存储过程时,在输入空格时,使用英式键盘,否则,会报如下错误

Compilation errors for PROCEDURE FENG.PRM_EXAMPLE

Error: PLS-00103: 出现符号 "?"在需要下列之一时:
        ( begin case declare exit for
          goto if loop mod null pragma raise return select update while
          with
         
<< continue close current delete fetch lock
          insert open rollback savepoint set sql execute commit forall
          merge pipe purge
Line: 3
Text: begin 
 

这里遇到了写入全角空格而导致存储过程执行失败的错误,空格删掉,重新按空格解决。

Oracle存储过程的调用_第5张图片

Oracle存储过程的调用_第6张图片

游标的使用。看到的一段解释很好的概念,如下:
    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。 
游标有两种类型:显式游标和隐式游标。在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。 
游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。

在我们进行insert、update、delete和select   value into  variable 的操作中,使用的是隐式游标

            隐式游标的属性 返回值类型   意    义   

  1. SQL%ROWCOUNT    整型  代表DML语句成功执行的数据行数   
  2. SQL%FOUND   布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功   
  3. SQL%NOTFOUND    布尔型 与SQL%FOUND属性返回值相反   
  4. SQL%ISOPEN  布尔型 DML执行过程中为真,结束后为假  

修改雇员工资

create or replace procedure prc_example (epo in number) as
BEGIN  
        UPDATE emp SET sal=sal+100 WHERE empno=epo;   
         IF SQL%FOUND THEN    
        DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');   
        COMMIT;    
        ELSE  
        DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');   
         END IF;    
        END; 

 

      declare
        e_number number;
        begin
         e_number:=7788;
         prc_example(e_number);
         end;

显式游标

 

使用游标查询所有编号为10 的员工名

create or replace procedure prc_example is
begin
  declare
   cursor emp_sor  is select ename,sal from emp where deptno=10;  
    cname emp.ename%type;     
    csal emp.sal%type;
 begin
   open emp_sor;       
   loop        
     fetch emp_sor into cname,csal;  --取游标的值给变量。             
     dbms_output.put_line('ename:'||cname);        
     exit when emp_sor%notfound;        
    end loop;         
    close emp_sor;     
 end;
end;

你可能感兴趣的:(Oracle存储过程的调用)