在plsql 中 sql 窗口 书写 ,执行, 后在 all objects 窗口 procedures可以进行测试。
一存储过程实例1:
create or replace procedure area(v_zdbh in zk_fxxx.zdbh%type, v_nsrsbh out zk_fxxx.nsrsbh%type)
is
begin
select nsrsbh into v_nsrsbh
from zk_fxxx
where zdbh = v_zdbh;
end area;
实例2:
create or replace procedure test(ag in number) is
begin
if ag >15 then
begin
update employ set
education ='高中'
where age = ag;
end;
end if;
if ag <=15 then
begin
update employ set
education ='初中'
where age =ag;
end;
end if;
end test;
实例3:
create or replace procedure zdrk (zdbh in varchar2 ,zdlx in char, bh in zk_jz_fxxx.jf_lsh%type ) ---varchar(8) 有误不能加(8)
is
i number :=0;
j zk_fxxx.srsbh%type :='';
n number(8);
begin
n := zdbh;
loop
delete from zk_fxxx t
where t.zdbh = to_char( zdbh,'xxxxxxxxx');
if i > zdbh+10 then
exit;
end if;
end loop;
end zdrk;
mysql navicat 下 有关游标的
简单 存储过程实例
BEGIN
DECLARE temp INT;
DECLARE name VARCHAR(30);
SET temp = idbegin;
SET name = '存储过程测试';
WHILE temp <= idend
DO
INSERT INTO test_name VALUES(temp,name);
SET temp = temp+1;
END WHILE;
END
实例2
BEGIN
#Routine body goes here...
DECLARE tempid INT DEFAULT 0;
DECLARE tempname VARCHAR(30) default '';
DECLARE cur CURSOR FOR SELECT id, name from test_name WHERE id> 2; -- 游标声明位置 变量之后 异常志强
/*
02000 发生下述异常之一:
SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。
在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。
在 FETCH 语句中引用的游标位置处于结果表最后一行之后。
*/
declare CONTINUE HANDLER FOR SQLSTATE '02000' set tmp = 0;
-- declare CONTINUE HANDLER FOR NOT FOUND set tempid = 0; 亦可以
OPEN cur; -- 打开游标
FETCH cur INTO tempid, tempname; -- 从游标获取 值
WHILE tempid!=0
DO
SELECT tempid, tempname; -- 打印 值 分多个结果显示
UPDATE test_name SET name = CONCAT(tempid,'号',tempname)
WHERE id = tempid;
FETCH cur INTO tempid, tempname;
END WHILE;
CLOSE cur; -- 关闭游标
END
存储过程
1 CREATE OR REPLACE PROCEDURE 存储过程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
行5:
END关键词表明PL/SQL体的结束
存储过程创建语法:
create or replace procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围); --vs_msg VARCHAR2(4000);
变量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表示输出
类型可以使用任意Oracle中的合法类型。
2, 变量带取值范围,后面接分号
3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4, 用select 。。。into。。。给变量赋值
5, 在代码中抛异常用 raise+异常名
CREATE OR REPLACE PROCEDURE存储过程名
(
--定义参数
is_ym IN CHAR(6) ,
the_count OUT NUMBER,
)
AS
--定义变量
vs_msg VARCHAR2(4000); --错误信息变量
vs_ym_beg CHAR(6); --起始月份
vs_ym_end CHAR(6); --终止月份
vs_ym_sn_beg CHAR(6); --同期起始月份
vs_ym_sn_end CHAR(6); --同期终止月份
--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT 。。。
FROM 。。。
WHERE 。。。
GROUP BY 。。。;
BEGIN
函数实例:
create or replace function xx (id in zk_fxxx.zdbh%type )
return char
is
dw_dm zk_jz_fxxx.dw_dm%type := '';
begin
select dw_dm into dw_dm from zk_fxxx where zdbh = id;
return dw_dm;
end xx ;