taoxingtianxia 发表于 2013-1-14 08:57:10

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 procedure_name

{AS|IS}
declaration_section
BEGIN
executable_section
[EXCEPTION
exception_section]
END


  每个参数的语法如下:


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


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


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


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


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


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


CREATE [ OR REPLACE] FINCTION function_name

RETURN returning_datatype
{AS|IS}
declaration_section
BEGIN
executable_section

exception_section
END


  在执行部分函数必须有哟个或多个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 PACKAGE package_name
{AS|IS}
public_variable_declarations |
public_type_declarations |
public_exception_declarations |
public_cursor_declarations |
function_declarations |
procedure_specifications
END


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


CREATE PACKAGE BODY package_name
{AS|IS}
private_variable_declarations |
private_type_declarations |
private_exception_declarations |
private_cursor_declarations |
function_declarations |
procedure_specifications
END


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


帮助网址: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存储过程可以返回多个值,函数只能返回一个值。


 
页: [1]
查看完整版本: Oracle函数与存储过程