您的位置:首页 > 数据库 > Oracle

Oracle中的函数与存储过程

2012-05-02 13:04 295 查看
1.基本结构

CREATE OR REPLACE PROCEDURE 存储过程名字

(

    参数1 IN NUMBER,

    参数2 IN NUMBER

) IS

变量1 INTEGER :=0;

变量2 DATE;

BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT

  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条

  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)

  例子:

  BEGIN

  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

      xxxx;

  END;

  ...

3.IF 判断

  IF V_TEST=1 THEN

    BEGIN

       do something

    END;

  END IF;

4.while 循环

  WHILE V_TEST=1 LOOP

  BEGIN

  XXXX

  END;

  END LOOP;

5.变量赋值

  V_TEST := 123;

6.用for in 使用cursor

  ...

  IS

  CURSOR cur IS SELECT * FROM xxx;

  BEGIN

  FOR cur_result in cur LOOP

  BEGIN

  V_SUM :=cur_result.列名1+cur_result.列名2

  END;

  END LOOP;

  END;

7.带参数的cursor

  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;

  OPEN C_USER(变量值);

  LOOP

  FETCH C_USER INTO V_NAME;

  EXIT FETCH C_USER%NOTFOUND;

  do something

  END LOOP;

  CLOSE C_USER;

8.用pl/sql developer debug

  连接数据库后建立一个Test WINDOW

  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

9.一般在oracle中 select into用于存储过程中

如:select count(*) into v_count from table_name where id=1;

意思就是把id=1的数量放到一变量v_count中,在后续的过程中调用这个变量。

10.在Oracle存储过程中需要遍历一张表,有一个更方便的方法就是使用for in loop … end loop

11.无返回值的存储过程

存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN

INSERT INTO HYQ.B_ID(I_ID,I_NAME) VALUES(PARA1,PARA2); END TESTA;

12.有返回值的存储过程

要求:建张表TESTTB,里面两个字段(I_ID,I_NAME)

12.1有返回值的存储过程(非列表)

存储过程为:CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2OUT VARCHAR2) AS BEGIN SELECT INTO PARA2 FROM TESTTB WHERE I_ID = PARA1;END TESTTB;

12.2返回列表

1.建立一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE AS TYPE Test_CURSOR IS REFCURSOR;

END TESTPACKAGE;

2.建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGETest_CURSOR) IS

BEGIN OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out参数来返回值的。

13.oracle 中 <> 为不等于的意思。

14.过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值。过程有零个或多个参数,没有返回值。函数和过程都可以通过参数列表接收或返回零个或多个值,函数和过程的主要区别不在于返回值,而在于他们的调用方式。过程是作为一个独立执行语句调用的:

pay_involume(invoice_nbr,30,due_date);

函数以合法的表达式的方式调用:

order_volumn:=open_orders(SYSDATE,30);

创建过程的语法如下:

CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name

[parameter_lister]

{AS|IS}

declaration_section

BEGIN

executable_section

[EXCEPTION

exception_section]

END [procedure_name]

每个参数的语法如下:

paramter_name mode datatype [(:=|DEFAULT) value]

mode有三种形式:IN、OUT、INOUT。

IN表示在调用过程的时候,实际参数的取值被传递给该过程,形式参数被认为是只读的,当过程结束时,控制会返回控制环境,实际参数的值不会改变。

OUT在调用过程时实际参数的取值都将被忽略,在过程内部形式参数只能是被赋值,而不能从中读取数据,在过程结束后形式参数的内容将被赋予实际参数。

INOUT这种模式是IN和OUT的组合;在过程内部实际参数的值会传递给形式参数,形势参数的值可读也可写,过程结束后,形势参数的值将赋予实际参数。

创建函数的语法和过程的语法基本相同,唯一的区别在于函数有RETUREN子句

CREATE [ OR REPLACE] FINCTION [schema.]function_name

[parameter_list]

RETURN returning_datatype

{AS|IS}

declaration_section

BEGIN

executable_section

[EXCEPTION]

exception_section

END [procedure_name]

在执行部分函数必须有哟个或多个return语句。

在创建函数中可以调用单行函数和组函数,例如:

CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)

RETURN NUMBER

IS

pi NUMBER=ACOS(-1);

RadiansPerDegree NUMBER;

 

BEGIN

RadiansPerDegree=pi/180;

RETURN(SIN(DegreesIn*RadiansPerDegree));

END

  

15.包

包是一种将过程、函数和数据结构捆绑在一起的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另一部分是包主体(package body),

包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。

打包的PL/SQL程序和没有打包的有很大的差异,包数据在用户的整个会话期间都一直存在,当用户获得包的执行授权时,就等于获得包规范中的所有程序和数据结构的权限。

但不能只对包中的某一个函数或过程进行授权。包可以重载过程和函数,在包内可以用同一个名字声明多个程序,在运行时根据参数的数目和数据类型调用正确的程序。

创建包必须首先创建包规范,创建包规范的语法如下:

CREATE [OR REPLACE] PACKAGE package_name

{AS|IS}

public_variable_declarations |

public_type_declarations |

public_exception_declarations |

public_cursor_declarations |

function_declarations |

procedure_specifications

END [package_name]

创建包主体使用CREATE PACKAGE BODY语句:

CREATE [OR REPLACE] PACKAGE BODY package_name

{AS|IS}

private_variable_declarations |

private_type_declarations |

private_exception_declarations |

private_cursor_declarations |

function_declarations |

procedure_specifications

END [package_name]

私有数据结构是那些在包主体内部,对被调用程序而言是不可见的。

帮助网址:http://dbajun.iteye.com/blog/256455

16.oracle函数与存储过程总结:

存储过程例子:根据ID查询学生信息

CREATE OR REPLACE PROCEDURE P_STU(

 
V_ID IN OUT VARCHAR2,

 
V_NAME OUT VARCHAR2,

 
V_PROFESSION OUT VARCHAR2

)IS

BEGIN

SELECT NAME , PROFESSION INTO V_NAME , V_PROFESSION FROM STUDENT WHERE ID = V_ID;

END P_STU;

FUNCTION函数例子:根据ID查询学生姓名

CREATE OR REPLACE FUNCTION F_STU(

                           V_ID IN VARCHAR2

                           )RETURN VARCHAR2 IS

V_NAME VARCHAR2(50);

BEGIN

SELECT NAME INTO V_NAME FROM STUDENT WHERE ID = V_ID;

RETURN V_NAME;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR(-20001,'你输入的ID无效!');

END F_STU;

一般地,oracle存储过程可以返回多个值,函数只能返回一个值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息