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. 微信开发第8章 通过accesstoken将长连接转换为短链接

    业务场景:开发的过程中经常会有一些很长的链接,这个时候如果生成二维码,会导致扫码的过程中识别比较慢,如果存入数据库,会导致数据库的字段长度要设定的很长才行,所以把长连接转换为短链接就越来越重要了. 接 ...

  2. org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.

    该问题已经困扰了我很多天 问题终于解决了,全局变量导致的,碰到这种问题很难再自己本身的机器上发现错误,所以,应该看一下自己写的方法是否涉及到了全局变量出现不一致的情况,让其统一即可.

  3. 算法基础:最大递减数问题(Golang实现)

    给出一个非负整数,找到这个非负整数中包括的最大递减数.一个数字的递减数是指相邻的数位从大到小排列的数字. 如: 95345323,递减数有:953,95,53,53,532,32, 那么最大的递减数为 ...

  4. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e)    首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e))    将运算符号移动到对应括号的前面 ...

  5. MongoDB的地埋空间数据存储、空间索引以及空间查询

    一.关于MongoDB 在众多NoSQL数据库,MongoDB是一个优秀的产品.其官方介绍如下: MongoDB (from "humongous") is a scalable, ...

  6. Spring mvc Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  7. 动作-CCActionInterval之CCActionEase家族

    补间动作也是一个包装器(之前叫补间动画,从字面上讲,叫动作更合适一些.).你也可以叫他缓释动作. 1.含义 补间动作改变的是,内部动作的执行速率(注意,并没有改变执行的最终效果,和执行的时间.)关于这 ...

  8. android使用模拟机测试时,若要联网IP地址该怎么写?

    android使用模拟机测试时,如果服务器也是本机,那么IP地址如果写为localhost或者127.0.0.1,这样其实是不能访问到本机上部署的服务端,那么该怎么写呢?很简单,把IP地址改为10.0 ...

  9. Android(java)学习笔记156:Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  10. 安卓开发中使用Genymotion模拟器

    在安卓开发中,运行和调试自己所写的安卓程序需要用到模拟器 在一般情况下 是直接在这创建一个模拟器,但是这种自带的模拟器运行效率不佳,而且启动时间漫长 所以,我们可以换一款安卓模拟器 Genymotio ...