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()是一个打印变量值的方法,效果如下

执行一个查找字段的方法

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;

这里:=是赋值符号

结果

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

右键选择test

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

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

插入两张表操作

      
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 <an identifier> <a double-quoted delimited-identifier>
          <a bind variable> << continue close current delete fetch lock
          insert open rollback savepoint set sql execute commit forall
          merge pipe purge
Line: 3
Text: begin 
 

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

游标的使用。看到的一段解释很好的概念,如下:
    游标是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;

  • 20
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您好!对于Oracle存储过程调用,可以使用以下步骤: 1. 创建存储过程:首先,您需要使用Oracle的SQL开发工具(如SQL Developer)或命令行工具(如SQL*Plus)创建存储过程存储过程是预定义的一组SQL语句和逻辑操作,可以在需要时进行调用和执行。 2. 调用存储过程:一旦存储过程被创建,您可以使用以下方法之一来调用它: - 使用EXECUTE语句:在SQL开发工具或命令行工具中,可以使用EXECUTE语句调用存储过程。例如,如果存储过程名为"my_procedure",您可以执行以下语句调用它: ``` EXECUTE my_procedure; ``` - 使用CALL语句:还可以使用CALL语句调用存储过程。例如,如果存储过程名为"my_procedure",您可以执行以下语句调用它: ``` CALL my_procedure; ``` - 使用PL/SQL块:如果您正在使用PL/SQL开发,可以在PL/SQL块中直接调用存储过程。例如: ``` BEGIN my_procedure; END; ``` 3. 传递参数:如果存储过程定义了参数,您可以在调用存储过程时传递参数。对于输入参数,您可以在调用语句中提供相应的值。对于输出参数,您需要提供变量来接收返回的值。 - 使用EXECUTE语句传递参数: ``` EXECUTE my_procedure(param1, param2); ``` - 使用CALL语句传递参数: ``` CALL my_procedure(param1, param2); ``` - 在PL/SQL块中使用参数: ``` DECLARE var1 VARCHAR2(100); var2 NUMBER; BEGIN my_procedure(var1, var2); -- 在这里可以使用var1和var2的值 END; ``` 这就是调用Oracle存储过程的基本步骤。希望对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值