Oracle存储过程入门
来源:互联网 发布:ssh端口 windows 编辑:程序博客网 时间:2024/04/28 10:57
学习的时候要静下心去学习,不要心浮气躁。其中找了一些网上的资料和自己的理解,再做以实践,由于存储过程内容是比较多的,我这里只能做个入门,希望大家能自己深入学习。
-- 文中这个符号,等于注释的意思
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN 数据类型,
参数2 IN 数据类型
) IS
变量1 数据类型;
变量2 数据类型;
BEGIN
********* --存储过程的业务,也就是你想要做的事
END 存储过程名字
上面的大写字母是保留字,数据类型有很多,说几个基本的,以后靠大家自己去学习,比如:NUMBER,VARCHAR,VARCHAR2,这里的等于符号是 := 这里定义变量的方式比较独特采用的是
变量 数据类型;
eg
t_name VARCHAR2(100);
t_age NUMBER;
如何给变量赋值
t_name := 'aaaaaaa';
t_age := 10;
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
select col1,col2 into 变量1,变量2 FROM 表名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
CREATE OR REPLACE PROCEDURE TEST(name in number)
IS
CURSOR cur IS select * FROM xxx; --这里是定义一个游标,把查询结果放入游标中,
--游标就象指针,大家可以这么去理解
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名;
END;
END LOOP;
END;
看看下面的例子
CREATE OR REPLACE PROCEDURE TEST(name in number)
is
V_SUM varchar2(200);
cursor cur is select * from LAD_USER;
BEGIN
for V_RESULT in cur LOOP
BEGIN
V_SUM := V_RESULT.User_Name;
END;
end LOOP;
DBMS_OUTPUT.put_line(V_SUM); --输出命令
END TEST;
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.运行
我第一次学习的时候很苯,连存储过程都没创建就去执行调用命令,请大家别和我一样。
有2种方式去执行
1.首先dos环境连接到oracle数据库
sqlplus 用户名/密码@数据库地址,通过这个命令可以连接到数据库。
比如:sqlplus TEST_ZJ/111111@192.168.10.10_ORCL
这样接连接上数据库了,下面把要创建的存储过程复制到一个txt文本文件,然后把文本文件修改为TEST.sql 这样类型的文件。
这里我直接把EST.sql存在了E:/根目录
连接上以后,接着执行命令 @TEST
/
执行完这2个命令,存储过程就被创建了。
调用存储过程 call TEST(1);
这样dos的创建和调用就结束了,我感觉还是挺麻烦的,不过这是基础,还是了解的好。
另一种办法,就是用工具了,就是第8点说的办法,下一个PLSQL Developer ,推荐,非常好用,连接上后,直接创建一个存储过程,通过执行,才能把存储过程写进数据库,再用Test WinDow进行测试,命令直接写call TEST(1) 然后点左上角的执行,就可以看到了结果了
存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->PROCEDURE Name [ (Parameter[,Parameter,] )]
IS |AS
[ Local Declarations]
BEGIN
Execute statements;
[ EXCEPTION Exception Handlers]
END [ Name ] ;
2.调用
存储过程可以直接用EXECUT命令调用或PL/SQL程序块内部调用。用EXECUT命令调用存储过程的格式如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL > EXCUTE Proc_Name(par1, par2…);
存储过程也可以被另外的PL/SQL块调用,调用的语句是:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DECLARE par1, par2;
BEGIN
Proc_Name(par1, par2…);
END ;
3.释放
当某个存储过程不再需要时,应将其从内存中删除,以释放它占用的内存资源。释放过程的语句格式如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL > DROP PROCEDURE Proc_Name;
4.实例:
编写存储过程,显示所指定雇员名所在的部门名和位置。
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->CREATE OR REPLACE PROCEDURE DeptMesg(pename emp.ename % TYPE,
pdname OUT dept.dname % TYPE,
ploc OUT dept.loc % TYPE) AS
BEGIN
SELECT dname, loc
INTO pdname, ploc
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND emp.ename = pename;
END ;
调用:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->VARIABLE vdname VARCHAR2 ( 14 );
VARIABLE vloc VARCHAR2( 13 );
EXECUTE DeptMesg(' SMITH ' , :vdname£? :vloc);
PRINT vdname vloc;
看完后,我自己学习写的demo
CREATE OR REPLACE PROCEDURE DeptMesg(peid OUT LAD_USER.USER_ID%TYPE,pename OUT LAD_USER.USER_NAME%TYPE) IS
BEGIN
SELECT USER_ID, USER_NAME INTO peid,pename
FROM LAD_USER
WHERE USER_ID = 1;
END DeptMesg;
测试代码
-- Created on 2009-7-22 by ADMINISTRATOR
declare
-- Local variables here
id integer;
names varchar2(100);
begin
-- Test statements here
Dbms_Output.put_line('sssssssssssssss');
DeptMesg(peid => id, pename => names);
Dbms_Output.put_line('id:'||id);
Dbms_Output.put_line('names:'||names);
end;
希望大家能看明白
http://blog.csdn.net/cocojiji5/article/details/4364253
- Oracle存储过程入门
- Oracle存储过程入门
- oracle存储过程入门
- oracle存储过程入门
- Oracle存储过程入门
- Oracle存储过程入门
- Oracle存储过程入门
- Oracle 存储过程入门
- Oracle 存储过程入门简介
- Oracle入门-2存储过程
- Oracle 存储过程快速入门
- ORACLE存储过程实战之一:入门
- ORACLE PL/SQ入门 存储过程
- ORACLE存储过程从零到入门
- oracle存储过程--入门与调试
- oracle存储过程之入门1
- oracle 存储过程 从入门到精通
- Oracle 存储过程入门(一)
- div 与 tr td table 嵌套关系
- C# 怎么控制pdf打开是的缩放比例?
- 让两个HorizontalScrollView联动
- 部分Dell 740 不支持 Xen Server?
- 用有序链表实现集合
- Oracle存储过程入门
- JAVA获取当前年的第一天和最后一天
- 关于synchronized
- PHP如何获得flv视频缩略图和视频时间
- jaxp与dom4j遍历xml树
- Cairo 图形指南 (4) —— 裁剪与遮蔽
- Android 将View固定到地图上
- Height of CComboBox's drop down list
- 设置线程的亲缘性,多线程编程