1. 创建存储过程:
1.1 在命令窗口创建:
该窗口有两个面板。
对话框面板:执行sql语句
编辑器面板:编辑sql, 其就是一个文本编辑器
1.2 在存储过程文件夹中创建
2. 存储过程语法
CREATE [OR REPLACE] PROCEDURE pro_name [(i_NAME IN VARCHAR2, o_age OUT NUMBER)] AS
...
BEGIN
...
exception
when others then
...
END [pro_name];
create:创建存储过程的动作命令
or replace: 如果存储过程名称已存在,则替换
procedure: 存储过程关键字
pro_name:存储过程名称,自定义,一般以“pro_”开头
(i_NAME IN VARCHAR2, o_age OUT NUMBER): 参数,分入参, 出参。 如果没有参数则括号也不能有
as和begin:as和begin之间用来声明变量
begin和end: begin和end之间是存储过程逻辑处理区域
exception和end:exception和end之间是异常处理逻辑, 可省略
end后面的pro_name: 存储过程名称, 可省略
3.存储过程案例:
/*
注意事项:
1. 没有参数时,声明部分不能有括号
2. 声明变量时可以显示指定变量模式:in表示为入参, out表示为出参, 不写则既可以是入参,也可以是出参。 最好明确具体模式
3. 参数需要指定参数类型, 但不能指定参数精度,如:varchar2(400)
4. 字符串的拼接使用双竖线"||", 不能用“+”, “+”只用在数字操作
5. 变量赋值使用":=", 如: age := 34;
6. 除了表字段别名可以使用双引号,其他的都用单引号。 表别名的双引号是可以省略的,所以尽量不在存储过程中使用双引号
7. 单引号既有引号的作用, 又有转义下一个单引号的作用。 简单理解:连续的两个引号(除了最外层的一个引号)表示输出一个单引号
8. 存储过程最后的”/" 在命令窗口中编译存储过程时,需要用"/"标识该存储过程已经结束。 非命令窗口时,可以不写
*/
CREATE OR REPLACE PROCEDURE pro_demo_create (i_NAME IN VARCHAR2, o_age OUT NUMBER) AS
/* as 和begin之间是声明变量的区域 */
v_NAME VARCHAR2(40) := 'changez';-- 声明变量并赋值
v_age NUMBER DEFAULT 20; --声明变量并赋值
BEGIN
IF i_NAME IS NOT NULL THEN
v_NAME := i_name;
END IF;
-- dbms_output.put_line() 输出内容到控制台
dbms_output.put_line('第一个存储过程');
-- 字符串的拼接用 "||"
dbms_output.put_line('v_NAME=' || v_NAME || ',v_age=' || v_age);
EXCEPTION --异常部分
WHEN OTHERS THEN --OTHERS 异常类型,可以捕获所有的异常
-- Sqlcode: 异常码
-- SQLERRM: 异常信息
dbms_output.put_line(Sqlcode||', '||SQLERRM);
END pro_demo_create;
/
4. 存储过程编译
在命令窗口的“编辑器”面板全选,然后按F8, 或者将要编译的完成代码复制到“对话框”面板,即可完成编译,当对话框里面出现“Procedure created”表示存储过程编译成功
5. 可能出现的问题
5.1 存储过程卡在这里了,没有出现编译通过的提示, 这种情况多半是存过程末尾没有“/”, 在这里输入"/” 然后回车即可。
5.2 提示编译错误, 如下图, 这是因为存储过程中有语法
可以输入 show error 查看具体的出错原因, 如下图