Oracle存储过程简单使用及示例代码

公司新项目启动需要将旧系统进行数据的迁移,初步决定使用存储过程进行数据迁移,所以将近期学习存储过程的相关知识进行汇总,在此感谢网上前辈提供的学习资料!

世界正在奖励那些偷偷学习的人。

一、什么是存储过程:

简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。

存储过程优点:
1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

二、存储过程与函数的区别:

    在我们学习一项新技术的时候,一定要对比已经掌握的东西进行探索,这样不仅可以温习旧的东西,还可以更深入了解新技术的原理,对于掌握新的知识更有帮助。

  相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。

        2.都是一次编译,多次执行。

  不同点:1.存储过程定义关键字用procedure,函数定义用function。

      2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。

      3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。

总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。

 

三、存储过程的分类:

1.无参数存储过程
2.含输入参数存储过程
3.含输出参数存储过程
4.含输入输出参数存储过程

四、存储过程的变量解释

default value:为参数设置默认值,只适用于in参数 
or replace:替换已经存在的存储过程 
procedure_name:存储过程名称 
parameter :参数名 
in :传递参数 
out:返回一个参数 
int out:传递和返回一个参数 
data_type:参数的数据类型,用于过程体重 
is | as:用于声明变量 
declaration_section:变量名称
begin:sql体开始
end:sql体结束

五、存储过程的创建

1、创建无参数存储过程:

 

------------------------创建存储过程---------------------------------------
create or replace procedure test_procedure
as
v_total number(1);
begin
  select count(*) into v_total from Aikes_Test;
  DBMS_OUTPUT.put_line('总人数:'||v_total);
end;

alter user scott account unlock; 
alter user scott identified by tiger;

------------执行存储过程
begin
  -- Call the procedure
  test_procedure;
end;

2、创建游标存储过程:

 

 

--------------------------创建带游标的存储过程-----------------------------
create or replace procedure test_cursor
    AS 
      ---使用游标
        CURSOR test_cursor IS select t.aid,t.name from Aikes_Test t;
    Begin
        for Test_record IN test_cursor loop---遍历游标,在打印出来
           DBMS_OUTPUT.put_line(Test_record.aid||Test_record.name);
        END LOOP;
        test_procedure;--同时执行另外一个存储过程(TEST_LIST中包含存储过程test_count)
    end;

 -----执行存储过程TEST_LIST
begin 
    test_cursor;
END;

3、创建带参数存储过程:
 

---------------------------------------------------------------------------------
---存储过程的参数
---IN  定义一个输入参数变量,用于传递参数给存储过程   
---OUT 定义一个输出参数变量,用于从存储过程获取数据   
---IN OUT  定义一个输入、输出参数变量,兼有以上两者的功能  
---这三种参数只能说明类型,不需要说明具体长度 比如 varchar2(12)
---defaul 可以不写,但是作为一个程序员最好还是写上。

--------------------------创建带参数的存储过程------------IN---------------------------
 create or replace procedure test_param_in(p_id1 in VARCHAR2  default '6')
        as v_name varchar2(32);
        begin
          select t.name into v_name from Aikes_Test t where t.aid=p_id1;
          DBMS_OUTPUT.put_line('name:'||v_name);
        end;
         
         
----执行存储过程----若不添加参数会使用存储过程中的默认参数
begin
   test_param_in;
end;

------------------------------创建有参数的存储过程-------------OUT---------------------
create or replace procedure test_param_out(v_name OUT VARCHAR2 )
as  
begin
  select name into v_name from Aikes_Test where aid='1';
  DBMS_OUTPUT.put_line('name:'||v_name);
End;
      
----执行存储过程
DECLARE  
  v_name VARCHAR2(32);   
  BEGIN  
  test_param_out(v_name);
END;  

------------------------------创建有参数的存储过程------IN-------OUT------------------
create or replace procedure test_param_in_out(myno in out varchar2)
as  
begin 
  idno:='1424'||myno;
end;
    
----执行存储过程
DECLARE  
  idno VARCHAR2(32);  
BEGIN  
  idno:='26731092';  
  test_param_in_out(idno);  
  DBMS_OUTPUT.PUT_LINE('证件号:'||idno);  
END;  


4、查看有哪些存储过程:

 

 

select * from user_source;

六、存储过程中异常和事务的处理:

 

create or replace Procedure demo_procedure(no in VARCHAR2)
    AS 
        CURSOR demo_cursor IS (SQL语句)
    Begin
      for demo_record IN demo_cursor Loop
          --deal data;
          Commit;              
     End Loop;
       Exception
         When Others Then
	    Rollback;
            Raise;--将异常抛出,交给上层处理
    End demo_procedure;


总结:本文记录的只是最基本的语法,在实际应用中还会有各式各样的问题,这就需要大家针对不同的问题各自分析,大部分是因为语法问题导致失败,还有一小部分就是权限问题导致失败。最后存储过程的内部逻辑需要根据不同的业务制定最佳算法,针对存储过程中涉及到的事务提交,以及异常的处理也要重点留意。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是一个使用管道函数的 Oracle 存储过程示例代码: ``` CREATE OR REPLACE TYPE dept_type AS OBJECT ( deptno NUMBER, dname VARCHAR2(14), loc VARCHAR2(13) ); CREATE OR REPLACE TYPE dept_tab_type AS TABLE OF dept_type; CREATE OR REPLACE FUNCTION get_dept_info (p_deptno IN NUMBER) RETURN dept_tab_type PIPELINED AS l_dept dept_type; BEGIN FOR r IN (SELECT deptno, dname, loc FROM dept WHERE deptno = p_deptno) LOOP l_dept := dept_type(r.deptno, r.dname, r.loc); PIPE ROW(l_dept); END LOOP; RETURN; END; CREATE OR REPLACE PROCEDURE display_dept_info (p_deptno IN NUMBER) AS BEGIN FOR r IN (SELECT * FROM TABLE(get_dept_info(p_deptno))) LOOP DBMS_OUTPUT.PUT_LINE('Deptno: ' || r.deptno || ', Dname: ' || r.dname || ', Loc: ' || r.loc); END LOOP; END; ``` 这个存储过程定义了一个 `dept_type` 类型和一个 `dept_tab_type` 表类型,然后定义了一个名为 `get_dept_info` 的函数,该函数接受一个部门编号参数,并返回一个 `dept_tab_type` 表类型,其中包含指定部门的信息。函数使用 `PIPELINED` 关键字表示它是一个管道函数,可以逐行返回结果。 最后,存储过程 `display_dept_info` 调用 `get_dept_info` 函数并打印返回的部门信息。 ### 回答2: Oracle 存储过程管道函数示例代码如下: ```sql -- 创建一个简单存储过程管道函数,返回指定范围内的奇数 CREATE OR REPLACE FUNCTION get_odd_numbers( start_number IN NUMBER, end_number IN NUMBER) RETURN SYS_REFCURSOR PIPELINED AS v_number NUMBER := start_number; BEGIN WHILE v_number <= end_number LOOP IF MOD(v_number, 2) = 1 THEN PIPE ROW(v_number); -- 将当前奇数放入管道中 END IF; v_number := v_number + 1; END LOOP; RETURN; END; / ``` 此示例代码创建了一个名为get_odd_numbers的存储过程管道函数,接受两个参数start_number和end_number,用于指定返回的奇数范围。函数内部通过一个循环判断每个数是否为奇数,并将奇数依次放入管道中。最后通过RETURN语句返回结果。 使用存储过程管道函数可以通过以下方式获取奇数: ```sql -- 调用存储过程管道函数 SELECT * FROM TABLE(get_odd_numbers(1, 10)); ``` 上述代码将返回1至10之间的所有奇数:1、3、5、7、9。 ### 回答3: Oracle存储过程管道函数是一种特殊类型的存储过程,它可以返回一个结果集。下面是一个示例代码,用于说明Oracle存储过程管道函数的用法: ```sql -- 创建一个管道对象作为存储过程的返回类型 CREATE OR REPLACE TYPE employee_info AS OBJECT ( employee_id NUMBER, full_name VARCHAR2(100), hire_date DATE ); / -- 创建一个管道表类型,用于存储多个employee_info对象 CREATE OR REPLACE TYPE employee_table AS TABLE OF employee_info; / -- 创建一个具有管道函数功能的存储过程 CREATE OR REPLACE FUNCTION get_employees RETURN employee_table PIPELINED AS BEGIN -- 在这里可以编写查询语句,获取想要的员工数据 -- 这里仅做示例,假设从一个名为employees的表中获取数据 FOR emp IN (SELECT employee_id, first_name || ' ' || last_name AS full_name, hire_date FROM employees) LOOP -- 将查询结果逐行插入管道表中 PIPE ROW(employee_info(emp.employee_id, emp.full_name, emp.hire_date)); END LOOP; RETURN; END; / -- 调用存储过程管道函数,并输出结果 SELECT * FROM TABLE(get_employees()); ``` 上述代码中,首先我们创建了一个管道对象`employee_info`,它包含了三个属性:`employee_id`、`full_name`和`hire_date`。然后,我们创建了一个管道表类型`employee_table`,用于存储多个`employee_info`对象。 接着,我们创建了一个具有管道函数功能的存储过程`get_employees`,其中使用了一个游标`emp`来存储查询结果。通过`PIPE ROW`语句,我们将每一行查询结果插入到管道表中。最后,通过`RETURN`语句返回结果。 最后,在主程序中我们通过`SELECT`语句调用存储过程管道函数,并使用`TABLE`函数将结果显示出来。 这个示例代码演示了如何使用Oracle存储过程管道函数来获取员工信息,并将查询结果作为一个结果集返回。通过这种方式,我们可以更加灵活地处理和使用存储过程的输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aikes902

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值