转自:http://www.cnblogs.com/wolfplan/p/4004624.html

关键字: 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单步调试

oracle 存储过程

关键字: oracle 存储过程

存储过程创建语法:
       create or replace procedure
存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围);
变量2 类型(值范围);

Begin
    Select count(*) into 变量1 from 表A where列名=param1;
    If
(判断条件) then
       Select 列名 into 变量2 from 表A where列名=param1;
      
Dbms_output。Put_line(‘打印信息’);
    Elsif (判断条件) then
      
Dbms_output。Put_line(‘打印信息’);
    Else
       Raise 异常名(NO_DATA_FOUND);

    End if;
Exception
    When others then
       Rollback;

End;

注意事项:
1,  存储过程参数不带取值范围,in表示传入,out表示输出
2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4,  用select 。。。into。。。给变量赋值
5, 
在代码中抛异常用 raise+异常名

以命名的异常
命名的系统异常                          产生原因

ACCESS_INTO_NULL                   未定义对象

CASE_NOT_FOUND                     CASE 中若未包含相应的 WHEN ,并且没有设置
ELSE 时

COLLECTION_IS_NULL                集合元素未初始化
CURSER_ALREADY_OPEN         
游标已经打开
DUP_VAL_ON_INDEX                   唯一索引对应的列上有重复的值

INVALID_CURSOR                 在不合法的游标上进行操作

INVALID_NUMBER                       内嵌的 SQL 语句不能将字符转换为数字

NO_DATA_FOUND                        使用 select into 未返回行,或应用索引表未初始化的

TOO_MANY_ROWS                      执行 select into 时,结果集超过一行

ZERO_DIVIDE                              除数为 0

SUBSCRIPT_BEYOND_COUNT     元素下标超过嵌套表或 VARRAY 的最大值

SUBSCRIPT_OUTSIDE_LIMIT       使用嵌套表或 VARRAY 时,将下标指定为负数

VALUE_ERROR                             赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED                           PL/SQL 应用程序连接到 oracle 数据库时,提供了不

正确的用户名或密码
NOT_LOGGED_ON                       PL/SQL 应用程序在没有连接 oralce
数据库的情况下
访问数据
PROGRAM_ERROR                       PL/SQL 内部问题,可能需要重装数据字典&
pl./SQL
系统包
ROWTYPE_MISMATCH                宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

SELF_IS_NULL                             使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR                        运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID                         无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时 

 
语法及示例:1、存储过程创建存储过程的语法:CREATE [OR REPLACE] PROCEDURE
procedure_name[(parameter_list)]{IS|AS}[local_declarations]BEGINexecutable_statements[EXCEPTIONexception_handlers]END
[procedure_name];其中:procedure_name是过程的名称。parameter_list是参数列表。local_declarations是局部声明。executable_statements是可执行语句。exception_handlers是异常处理程序。示例1:演示创建过程(参数列表中为IN参数赋予一个默认值,不能为OUT、IN
OUT参数赋予默认值)create or replace procedure find_emp(emp_no in number:=7900)asempname
varchar2(20);beginselect ename into empname from emp where
empno=emp_no;dbms_output.put_line('雇员姓名是 '||empname);exceptionwhen no_data_found
thendbms_output.put_line('雇员编号未找到');end find_emp;调用过程:EXECUTE
procudure_name(parameters_list);也可以在过程里面调用,直接写上procudure_name而不必写EXECUTE。

示例2:演示创建带OUT参数的过程 create or replace procedure
test(value1 varchar2,value2 out number) is identity number; begin select sal
into identity from emp where empno=value1; if identity<2000 then
value2:=1000; else value2:=500; end if; end;

调用带OUT参数的过程: declare value2 number; begin
test('7900',value2); dbms_output.put_line(value2); end;

示例3:演示创建带IN OUT参数的过程 create or replace procedure
swap(p1 in out number,p2 in out number) is v_temp number; begin v_temp:=p1;
p1:=p2; p2:=v_temp; end;

调用带IN OUT参数的过程: declare num1 number:=100; num2
number:=200; begin swap(num1,num2); dbms_output.put_line('num1= '||num1);
dbms_output.put_line('num2= '||num2); end;

示例4:将过程的执行权限授予其他用户 GRANT EXECUTE ON find_emp TO
scott; GRANT EXECUTE ON swap TO PUBLIC;
将find_emp过程的执行权限授予给用户scott,将执行swap过程的权限授予所有数据库用户。 删除过程语法:DROP PROCEDURE
procudure_name;

2、函数 定义函数的语法如下: CREATE [OR REPLACE] FUNCTION
function_name [(parameter_list)] RETURN datatype {IS|AS} [local_declarations]
BEGIN executable_statements [EXCEPTION exception_handlers] END [function_name];
其中:function_name是函数的名称。 parameter_list是参数列表。 local_declarations是局部声明。
executable_statements是可执行语句。 exception_handlers是异常处理程序。
使用函数时注意:形式参数必须只使用数据库类型,不得使用PL/SQL类型。函数的返回类型也必须是数据库类型。
函数不能单独执行,只能通过SQL语句或PL/SQL程序块来调用。 示例5:演示如何创建函数 create or replace function
fun_hello return varchar2 is begin return '朋友,您好'; end; 调用函数:select fun_hello
from dual;

函数的授权:同过和的授权一样具体请看示例4。 删除函数:DROP FUNCTION
function_name

过程和函数的差异 过程 函数 作为PL/SQL语句执行 作为表达式的一部分调用
在规范中不包含RETURN子句 必须在规范中包含RETURN子句 不返回任何值 必须返回单个值 可以包含RETURN语句,但是与函数不同,它不能用于返回值
必须包含至少一条RETURN语句

3、程序包 创建包规范的语法: CREATE [OR REPLACE] PACKAGE
package_name IS|AS [Public type and item declarations] [Subprogram
specifications] END [package_name]; 其中:package_name是包的名称。 Public type and item
declarations是声明类型、常量、变量、异常和游标等。 Subprogram specifications声明PL/SQL子程序。
示例6:演示创建程序包规范 create or replace package pack_op is procedure pro_print_ename(id
number); procedure pro_print_sal(id number); function fun_re_date(id number)
return date; end;

创建包主体的语法: CREATE [OR REPLACE] PACKAGE BODY
package_name IS|AS [Public type and item declarations] [Subprogram bodies]
[BEGIN Initialization_statements] END [package_name]; 其中:package_name是包的名称。
Public type and item declarations是声明类型、常量、变量、异常和游标等。 Subprogram
bodies是定义公共和私有PL/SQL子程序。

示例7:演示创建程序包主体 create or replace package body pack_op
is procedure pro_print_ename(id number) is name emp.ename%type; begin select
ename into name from emp where empno=id; dbms_output.put_line('职员姓名:'||name);
end pro_print_ename; procedure pro_print_sal(id number) is salary emp.sal%type;
begin select sal into salary from emp where empno=id;
dbms_output.put_line('职员工资:'||salary); end pro_print_sal; function
fun_re_date(id number) return date is bedate emp.hiredate%type; begin select
hiredate into bedate from emp where empno=id; return bedate; end fun_re_date;
end pack_op;

示例8:调用程序包中创建的过程和函数 exec
pack_op.pro_print_ename(7900); exec pack_op.pro_print_sal(7900); select
pack_op.fun_re_date(7900) from dual;

示例9:演示程序包中的游标 创建包规范 create or replace package
pack_emp is cursor cur_emp return emp%rowtype; procedure pro_cur; end
pack_emp;

创建包主体 create or replace package body pack_emp is
cursor cur_emp return emp%rowtype is select * from emp; procedure pro_cur is
rec_emp emp%rowtype; begin open cur_emp; loop fetch cur_emp into rec_emp; exit
when cur_emp%notfound; if rec_emp.sal<1000 then
dbms_output.put_line('员工工资:'||rec_emp.sal||',需加倍努力争取提高工资'); elsif
rec_emp.sal>=1000 and rec_emp.sal<2000 then
dbms_output.put_line('员工工资:'||rec_emp.sal||',工资一般,争取搞个部门经理做做'); else
dbms_output.put_line('员工工资:'||rec_emp.sal||',工资不错,争取搞个总经理做做'); end if; end loop;
end pro_cur; end pack_emp;

调用程序包中的过程以调用程序包中的游标 exec pack_emp.pro_cur;

示例10:存储过程返回游标的子程序包(此程序包返回r_cur游标) CREATE OR REPLACE
package SCOTT.pk_wt is type mytype is ref cursor; procedure p_wt(mycs out
mytype); end;

CREATE OR REPLACE package BODY SCOTT.pk_wt is
procedure p_wt(mycs out mytype) is r_cur mytype; begin open r_cur for select *
from emp; mycs:=r_cur; end p_wt; end pk_wt;

查询有关过程、函数和程序包的信息:USER_OBJECTS数据字典视图 column
object_name format a18 select object_name,object_type from user_objects where
object_type in ('PROCEDURE','FUNCTION','PACKAGE','PACKAGE
BODY');

(转载)Oracle procedure 基本语法的更多相关文章

  1. Oracle procedure 基本语法

    转自:http://lorry1113.javaeye.com/blog/513851 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程 ...

  2. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  3. Oracle存储过程基本语法 存储过程

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  4. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

  5. 移植Oracle procedure 到 postgresql

    1.登录postgresql psql -h 192.168.137.131 -p 5432 postgres satusc@6789#JKL 2.创建用户 CREATE USER name thun ...

  6. Oracle的基本语法,存储函数及触发器

    1.PL/SQL    PL/SQL是Oracle对 ql语言的过程化扩展,指在 SQL 命令语言中增加了过程处理语句,使SQL语言具有过程处理能力.把 SQL 语言的数据操纵能  力与过程语言的数据 ...

  7. 【转载】Makedown数学公式语法

    Typora数学模块 行间表达式快捷键($$) 点击"段落"->"公式块" 快捷键Ctrl+Shift+m "$$"+回车 行内表达式 ...

  8. oracle plsql基本语法

    oracle plsql 基本语法 --plsql默认规则:plsql赋值用":=" plsql判断用"=" plsql输入用"&" ...

  9. Oracle常用基础语法(未完待补和操作)

    这篇博客主要是Oracle常用基础语法, 另外,存储过程和存储函数很重要,这个后期看视频学习,还有DB优化,另外,还有plsql develop和navicat的使用,重点是数据的导入导出: ---- ...

随机推荐

  1. Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  2. xml格式转成json格式,使用Python

    import xml.etree.ElementTree root=xml.etree.ElementTree.parse('testXml.xml') book=root.findall('pers ...

  3. CodeForces 630G Challenge Pennants (组合数学)

    <题目链接> 题目大意: 有两种旗子,分别有5个和3个,将这些旗子分配给n个人,有多少中方法. 解题分析: 5面A旗子的发放方案为:$[1,1,1,1,1],[1,1,1,2],[1,2, ...

  4. event.target 和 event.currentTarget 的区别

    event.target This property of event objects is the object the event was dispatched on. It is differe ...

  5. [是男人就过8题——Pony.ai]Perfect N-P Arrays

    [是男人就过8题--Pony.ai]Perfect N-P Arrays 题目大意: 一棵\(n(\sum n\le5\times10^6)\)个结点的树,每个结点都有一个括号.求树上一个合法的括号序 ...

  6. XVII Open Cup named after E.V. Pankratiev. GP of Moscow Workshops

    A. Centroid Tree 枚举至多两个重心作为根,检查对于每个点是否都满足$2size[x]\leq size[father[x]]$即可. #include<stdio.h> # ...

  7. VS2013安装Boost

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  8. CSS3_扇形导航_transitionend 事件

    扇形导航 圆形按钮,切换一系列图片导航的显示与隐藏. 如果涉及过渡动画,定位的 top 和 left 必须写 Math.sin(弧度) 一圈弧度 = 2π,一圈角度 = 360 弧度 = (deg*2 ...

  9. ECMA Script 6_异步编程之 Promise

    Promise 对象 异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题 比传统的解决方案——回调函数和事件——更合理和更强大 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步 ...

  10. vue_条件渲染_v-if_v-else_v-show

    data: { ok: true flag: false } 1. 成对出现的 v-if 和 v-else 原理是: 标签的删除与重新创建 ,有些情况必须用 v-if <p v-if=" ...