pl/sql 存储过程实例

本文介绍了一个用于验证任务是否完成及是否存在异常的存储过程。该过程接受三个参数,并返回整型值以指示任务的状态。文章详细展示了如何通过SQL查询获取特定任务的状态,并通过异常处理确保过程的健壮性。
create or replace function IsDone(s_id in varchar2,s_TaskNum in varchar2,s_TaskType in integer)
  return integer is
  /*
功能描述:此存储过程用来验证任务是否完成,有无异常
传入参数3个,分别不同类型,返回值integer类型
返回值:0 正常、1 执行sql错误 、-1存储过程调用有误
  */
  //定义变量
  type   stringArr   is   varray(2)   of   varchar2(30); //定义一个定长的字符串数组数据类型  
  dflag          integer;//返回值
  iCount         integer;
  strs           stringArr;
  s_taskid       varchar2(20);
begin
  begin
  iCount := splitstr(s_TaskNum, '_', strs);//自定义函数,截取字符串
  s_taskid:=strs(1);
  
    select  flag
      into dflag
      from table_Task t
     where taskid = s_taskid
       and id=s_id
       and taskType = s_TaskType
       and rownum=1
     order by flag asc;
    exception
    when others then
      return 1;//执行sql语句异常
  end;
  return dflag;
EXCEPTION
  when others then
    return - 1;//调用存储过程失败
END IsDone;


 

PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sqlSQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;
PL/SQL 存储过程是 Oracle 数据库中用于封装业务逻辑的重要对象,它可以通过参数接收输入值、执行 SQL 操作,并返回结果或通过输出参数传递数据。以下是一些 PL/SQL 存储过程的编写和使用示例。 ### 示例1:创建一个简单的存储过程存储过程根据提供的员工编号查询并输出员工姓名: ```sql CREATE OR REPLACE PROCEDURE pro_test(v_in_empno NUMBER) IS v_name emp.ename%TYPE; BEGIN SELECT ename INTO v_name FROM emp WHERE empno = v_in_empno; dbms_output.put_line(v_name); END; / ``` 调用此存储过程的方式如下: ```sql exec pro_test(7369); ``` 执行后将输出对应的员工姓名 `SMITH` [^4]。 --- ### 示例2:带有输入和输出参数的存储过程 下面是一个更复杂的例子,定义了一个带有输入参数和输出参数的存储过程,计算两个数字之和并通过输出参数返回结果: ```sql CREATE OR REPLACE PROCEDURE calculate_sum ( num1 IN NUMBER, num2 IN NUMBER, result OUT NUMBER ) IS BEGIN result := num1 + num2; END; / ``` 调用该存储过程时需要声明变量来接收输出值: ```sql DECLARE res NUMBER; BEGIN calculate_sum(10, 20, res); dbms_output.put_line('The sum is: ' || res); END; / ``` 执行后会输出 `The sum is: 30` [^3]。 --- ### 示例3:返回结果集的存储过程(基于游标) PL/SQL 过程还可以通过游标返回一组记录。例如,以下过程返回某个部门的所有员工信息: ```sql CREATE OR REPLACE PROCEDURE get_employees_by_dept ( dept_id IN NUMBER, emp_cursor OUT SYS_REFCURSOR ) IS BEGIN OPEN emp_cursor FOR SELECT * FROM emp WHERE department_id = dept_id; END; / ``` 在 SQL*Plus 或 PL/SQL Developer 等工具中可以这样调用并查看结果: ```sql VAR rc REFCURSOR; EXEC get_employees_by_dept(10, :rc); PRINT rc; ``` --- ### 示例4:异常处理的存储过程 在实际应用中,异常处理对于确保程序健壮性非常重要。以下是一个包含异常处理机制的存储过程示例: ```sql CREATE OR REPLACE PROCEDURE find_employee ( emp_id IN NUMBER ) IS emp_name VARCHAR2(100); BEGIN SELECT ename INTO emp_name FROM emp WHERE empno = emp_id; dbms_output.put_line('Employee Name: ' || emp_name); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('No employee found with ID ' || emp_id); WHEN OTHERS THEN dbms_output.put_line('An error occurred'); END; / ``` 如果传入不存在的员工编号,如 `exec find_employee(9999);`,则会输出提示信息 `No employee found with ID 9999` [^2]。 --- ### 总结 以上几个示例展示了 PL/SQL 存储过程的基本结构、参数使用、异常处理以及如何返回结果集。这些内容覆盖了从简单到较复杂的应用场景,适用于大多数数据库开发需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值