PL/SQL存储过程
存储过程相当于一个有名字的PL/SQL块,经过第一次编译后再次调用时不需要再次编译

创建格式:

CREATE [OR REPLACE] PROCEDURE proc_name [list of parameters] 
IS    
   Declaration section 
BEGIN    
   Execution section  
EXCEPTION    
  Exception section 
END; 

返回值:

可有可没有

例子:

1> CREATE OR REPLACE PROCEDURE employer_details
2> IS 
3>  CURSOR emp_cur IS 
4>  SELECT first_name, last_name, salary FROM emp_tbl;
5>  emp_rec emp_cur%rowtype;
6> BEGIN 
7>  FOR emp_rec in sales_cur 
8>  LOOP 
9>  dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name
10>    || ' ' ||emp_cur.salary);
11> END LOOP;
12>END;
13> /

执行:

1)  EXECUTE [or EXEC] procedure_name;

2) 在另一个存储过程里面时:  procedure_name;


PL/SQL函数

函数和存储过程最大的区别是:函数必须有返回值。
 
创建语法:
CREATE [OR REPLACE] FUNCTION function_name [parameters] 
RETURN return_datatype;  
IS  
Declaration_section  
BEGIN  
Execution_section 
Return return_variable;  
EXCEPTION  
exception section  
Return return_variable;  
END; 

例子:

1> CREATE OR REPLACE FUNCTION employer_details_func
2>    RETURN VARCHAR(20);
3> IS 
5>    emp_name VARCHAR(20); 
6> BEGIN 
7>	SELECT first_name INTO emp_name
8>	FROM emp_tbl WHERE empID = '100';
9>	RETURN emp_name;
10> END;
11> / 

执行:

1) employee_name := employer_details_func;(给变量赋值)

2) SELECT employer_details_func FROM dual;(作为查询语句一部分)

3) dbms_output.put_line(employer_details_func);(PL/SQL里使用)


PL/SQL存储过程和函数中的参数

1) IN-parameters 
    默认参数类型,相当于一般编程语言里的函数参数,只读,不能改变其值。 
用法: 
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name1 [IN] datatype) 
2) OUT-parameters 
    只写,不可以用其值,但是可为其指定值。 
用法: 
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name OUT datatype) 
3) IN OUT-parameters
    可读可写 
用法: 
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name IN OUT datatype)
例1:

创建一个有IN和OUT参数的存储过程

1> CREATE OR REPLACE PROCEDURE emp_name (id IN NUMBER, emp_name OUT NUMBER)               
2> IS               
3> BEGIN             
4>    SELECT first_name INTO emp_name             
5>    FROM emp_tbl WHERE empID = id;             
6> END;               
7> /             

在PL/SQL块中调用emp_name存储过程.

1> DECLARE               
2>  empName varchar(20);               
3>  CURSOR id_cur SELECT id FROM emp_ids;               
4> BEGIN               
5> FOR emp_rec in id_cur               
6> LOOP               
7>   emp_name(emp_rec.id, empName);               
8>   dbms_output.putline('The employee ' || empName || ' has id ' || emp-rec.id);               
9> END LOOP;              
10> END;               
11> /

例2:

创建一个有IN OUT参数的存储过程
1> CREATE OR REPLACE PROCEDURE emp_salary_increase                
2> (emp_id IN emptbl.empID%type, salary_inout IN OUT emptbl.salary%type)                 
3> IS                
4>    tmp_sal number;                
5> BEGIN                
6>    SELECT salary                
7>    INTO tmp_sal                
8>    FROM emp_tbl               
9>    WHERE empID = emp_id;                
10>   IF tmp_sal between 10000 and 20000 THEN                
11>      salary_inout := tmp_sal * 1.2;                
12>   ELSIF tmp_sal between 20000 and 30000 THEN                
13>      salary_inout := tmp_sal * 1.3;                
14>   ELSIF tmp_sal > 30000 THEN                
15>      salary_inout := tmp_sal * 1.4;                
16>   END IF;               
17> END;               
18> / 
在PL/SQL块中调用emp_salary_increase存储过程.
1> DECLARE               
2>    CURSOR updated_sal is               
3>    SELECT empID,salary               
4>    FROM emp_tbl;               
5>    pre_sal number;               
6> BEGIN               
7>   FOR emp_rec IN updated_sal LOOP                
8>       pre_sal := emp_rec.salary;                
9>       emp_salary_increase(emp_rec.empID, emp_rec.salary);               
10>       dbms_output.put_line('The salary of ' || emp_rec.empID || 		   
11>                ' increased from '|| pre_sal || ' to '||emp_rec.salary);               
12>   END LOOP;                
13> END;                
14> /




PL/SQL学习(四)存储过程和函数的更多相关文章

  1. PL/SQL学习笔记_03_存储函数与存储过程

    ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. 存储函数:有返回值,创建完成后,通过select function() from dua ...

  2. pl/sql 笔记之存储过程、函数、包、触发器(下)

    一.存储过程.存储函数   1.What's This? ①.ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. ②.存储过程.存储函数的唯 ...

  3. PL/SQL编程(1) - 存储过程,函数以及参数

    存储过程 PROCEDURE [schema.]name[( parameter[, parameter...] ) ] [AUTHID DEFINER | CURRENT_USER ] [ACCES ...

  4. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  5. MYSQL数据库学习十四 存储过程和函数的操作

    14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...

  6. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  7. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  8. 剑指Offer——常用SQL语句、存储过程和函数

    剑指Offer--常用SQL语句.存储过程和函数 常用SQL语句 1.在MySQL数据库建立多对多的数据表关系 2.授权.取消授权 grant.revoke grant select, insert, ...

  9. pl/sql developer中dbms_output.put_line函数的运用

    pl/sql developer中dbms_output.put_line函数可以打印想显示在屏幕上的信息,运用时需要注意几点: 1 必须处于begin   ...  end: 2 需要先执行 set ...

  10. 在PL/SQL中调用存储过程--oracle

    在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int, sE ...

随机推荐

  1. 准备开一个地图SDK的开源项目

    最近有点空闲时间了, 准备开一个地图SDK的开源项目, 现在的地图SDK已经有很多了, 再做一个跟重新发明个轮子差不多, 但还想做的原因是想在别的轮子的基础上造个轮子... 初步设想是基于开源的地图渲 ...

  2. onSubmit的使用

    在web开发中,我们经常会遇到,一点回车键表单就自己提交的问题,能不能禁用回车键呢,答案是肯定的. Html代码  <from action="" method=" ...

  3. 使用bash判断PATH中是否存在某个路径

    在source设置环境变量的时候,有些时候可能会设置两次,导致增加系统的路径搜索时间,或者让自己看环境变量的时候搞得怪不爽的. 为了解决这个问题,我们可以在设置相应的环境变量之前,先判断一下是否已经设 ...

  4. GoogleProgressBar

    https://github.com/jpardogo/GoogleProgressBar

  5. Android图片压缩

    import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java ...

  6. 二叉树可视化--Graphviz

    大家平时写C程序有没有种把内存里的数据结构全给画出来的冲动呢?数据量小的话,画起来还蛮简单,用viso,我前面的文章都用viso画的.之前写红黑树代码的时候,用的是命令行把整个树打印出来,不过只是一些 ...

  7. mysql 5.6 oom 图

  8. FastJSON应用前测试--转载

    FastJSON 应用前测试   FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能.   ...

  9. <转载>解决div里面img的缝隙问题

    转载自:http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html   练习切图时发现img和父级div之间总是有2px空隙(chrome),上网搜索解决 ...

  10. VS 2013 编译和使用 Boost

    以 1.58.0 版本 boost 为例, 当前系统版本为 Windows 8.1 x64   1 编译boost  当前解压路径 "D:\Libraries\boost_1_58_0&qu ...