Oracle函数与存储过程


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,PARA2 OUT 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 REF CURSOR;

END TESTPACKAGE;


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

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE Test_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存储过程可以返回多个值,函数只能返回一个值。


猜你喜欢

转载自taoxingtianxia.iteye.com/blog/1460579