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. PAT 1075. PAT Judge (25)

    题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1075 此题主要考察细节的处理,和对于题目要求的正确理解,另外就是相同的总分相同的排名的处理一定 ...

  2. Visual C++ 2012/2013的内存溢出检測工具

    在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...

  3. PagerSlidingTabStrip

    https://github.com/jpardogo/PagerSlidingTabStrip     

  4. oepn sync

    http://blog.csdn.net/cywosp/article/details/8767327 SYNOPSIS #include <sys/types.h> #include & ...

  5. Apache【第一篇】安装

    一.简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web ...

  6. 关于NSRunLoop和NSTimer的深入理解

    一.什么是NSRunLoop NSRunLoop是消息机制的处理模式 NSRunLoop的作用在于有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠 NS ...

  7. 深入理解计算机系统第二版习题解答CSAPP 2.3

    填写空白.单字节可以用两个十六进制数表示. 十进制 二进制 十六进制 0 0000 0000 0x00 167 1010 0111 0xA7 62 0011 1110 0x3E 188 1011 11 ...

  8. 常见资源记录定义(Resource Record)

    所有的RRs(Resource Records)都具有相同的顶级字段格式定义:owner  TTL CLASS TYPE RDATA owner 指示拥有资源记录的DNS域名 TTL 对大多数资源记录 ...

  9. js相差天数计算

        dueDate = new Date(row.dueDate.replace(/-/g,'/'));                    if(dueDate<systemDate){ ...

  10. MyBatis自动获取主键,MyBatis使用Oracle返回主键,Oracle获取主键

    MyBatis自动获取主键,MyBatis使用Oracle返回主键,Oracle获取主键 >>>>>>>>>>>>>> ...