SQL是一种语言!

SQL是一种语言!

SQL是一种语言!

个人理解:存储过程就相当于Java中的方法;声明变量区域就相当于java中的声明局部变量一样,只是放到一个指定区域定义了

一、先看一部分基础:

1、语法:

CREATE OR REPLACE PROCEDURE 存储过程名字
(
  --声明参数(注意不需要写长度,和java的定义新的方法时的参数一样)
  参数1 IN NUMBER,
  参数2 out NUMBER
)IS   -- 声明变量区域,不需要声明变量可以不写
  -- 变量声明,每个声明用分号结束。可以在声明的同时初始化
  变量1 INTEGER :=0;
  变量2 DATE; BEGIN   --业务逻辑执行区域 END 存储过程名字; 这里的IS也可以用AS替代!

举个例子:

create        -- 存储过程头部区域开始
or replace --可选表示如果数据库中已经存在一条相同名称的存储过程就把它替换掉
procedure
proc_emp_create --存储过程名称 procedure_name
(
  empno number, ename varchar2, job varchar2, mgr number, hiredate date, sal number, comm number, deptno number
)
as
  --声明区域,不需要声明变量可以不写
begin -- PL/SQL标准执行语句
  --执行区域
insert into emp values(empno, ename, job, mgr, hiredate, sal, comm, deptno);
end;

一个存储过程可以分成三个区域:

头部区域
用于编写最基本的存储过程头部标记,定义是否要创建一个替代原有存储过程的存储过程;决定是否定义参数;定义参数的类型(in out inout);定义执行权限(Schema)。 声明区域
用于声明变量(要定义长度)包括cursor; 执行区域
用于执行业务逻辑代码,可以使用条件语句(选择、判断、循环。。。)来进行一些业务逻辑CRUD的处理;

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; 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

注意事项:

1、在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧; 2、oracle 的is 和as有什么区别?
在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
在视图(VIEW)中只能用AS不能用IS;
在游标(CURSOR)中只能用IS不能用AS;

二、再看一个例子来熟悉创建和调用(自己操作看结果)

create table mytest(
name varchar2(50),
age number(10)
); --循环往表中插入数据
DECLARE
X number; --声明变量
BEGIN
x := 1; --给初值
FOR X IN REVERSE 1 .. 10 LOOP
insert into mytest values ('张三',10);
END LOOP;
COMMIT;
END; --创建存储过程
create or replace procedure AutoUpdateName(
  v_oldName in VARCHAR2,/*旧名称*/
  v_newName in VARCHAR2/*新名称*/
)
is
begin   UPDATE mytest SET name=REPLACE(name,v_oldName,v_newName) WHERE name LIKE '%'||v_oldName||'%';   COMMIT; end AutoUpdateName; --调用该存储过程
begin
  AutoUpdateName('张三','李四');
  commit;
end; 结果会看到,调用该存储过程后将表中的数据张三全部替换成为了李四;

end;

最新文章

  1. String Mybatis 多数据源配置
  2. Git之VS2010实践
  3. linux上课
  4. SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
  5. java或者jsp中修复会话标识未更新漏洞
  6. majikan
  7. nginx利用limit模块设置IP并发防CC攻击
  8. Js中单引号和双引号的区别
  9. ELK 之一:ElasticSearch 基础和集群搭建
  10. CSS学习笔记:利用border绘制三角形
  11. eclipse中创建NDK和JNI开发环境最简单配置方法
  12. 用JS来实现于截取中英文混合字符串方法(转载)
  13. js实现深拷贝和浅拷贝
  14. LeetCode(123):买卖股票的最佳时机 III
  15. 【c++】删除string中指定的字符
  16. Dubbo 服务治理-mock实例
  17. wamp多站点多端口配置
  18. Intellij idea断点 Debugger slow: Method breakpoints my dramatically slow down debugging
  19. git创建仓库,并提交代码(第一次创建并提交)(转)
  20. CC3200使用MQTT的SSL加密证书可用日期修改

热门文章

  1. 用express搭建一个简单的博客系统
  2. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)
  3. J2EE开发实战基础系列一 HelloWorld
  4. 利用Github Pages建立仓库“门面”
  5. password & Encryption
  6. 子查询 做where条件 做 from的临时表 ,做select的一个字段 等
  7. hadoop 集群常见错误解决办法
  8. 习题:就是干(DP)
  9. visio中相关设置-菜单视图
  10. [Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树