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