- CREATE OR REPLACE PROCEDURE MyProName IS
- BEGIN
- NULL;
- 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 MyPro(param1 in varchar2,param2 out varchar2) as
- v_cnt number; --定义变量1
- tablename1 varchar2(80); --定义变量2
- sqlTxt varchar2(2000); --定义变量2
- BEGIN
- --处理逻辑
- NULL;
- END;
(1) 存储过程参数不带取值范围,in 表示传入,out 表示输出;类型可以使用任意 Oracle 中的合法类型。
(2) 变量带取值范围,后面接分号
- CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2,param2 out varchar2) as
- v_cnt number; --定义变量1
- tablename1 varchar2(80); --定义变量2
- sqlTxt varchar2(2000); --定义变量2
- BEGIN
- --处理逻辑
- NULL;
- commit;--提交事务
- Exception
- When others then
- Dbms_output.Put_line(sqlerrm);--打印输出错误
- Rollback;--回滚事务
- END;
提交事务,存在异常则回滚事务;
游标遍历
- CREATE OR REPLACE PROCEDURE MyPro(param1 in varchar2, param2 out varchar2) as
- v_cnt number; --定义变量1
- tablename1 varchar2(80); --定义变量2
- sqlTxt varchar2(2000); --定义变量2
- BEGIN
- --定义游标
- cursor c_tab_temp1 is
- select t.modelnumber, t.tablename from d_modelmap t;
- c_bom_row1 c_tab_temp1%rowtype;
- --处理逻辑
- --循环游标
- for c_bom_row1 in c_tab_temp1 loop
- tablename1 := c_bom_row1.tablename; --取游标中的值
- END LOOP;
- commit; --提交事务
- Exception
- When others then
- Dbms_output.Put_line(sqlerrm); --打印输出错误
- Rollback; --回滚事务
- END;
返回游标
- create or replace procedure test(
- res out varchar2,
- p_cur out sys_refcursor) as
- Begin
- open p_cur for
- select * from tableName
- res:='';
- end;
- --分支判断
- if tablename1 <> '' then
- --处理逻辑
- null;
- else
- --处理逻辑
- null;
- end if;
- --拼接动态sql
- sqltxt := 'update ' || tablename1 || ' t
- set t.partid=(select t3.f_id from i_partlist t3 where t3.part_no=t.part_no
- and nvl(t3.part_techstate,'' '')=nvl(t.part_techstate,'' ''))
- where not exists(select t2.f_id from i_Partlist t2 where t2.f_id=t.partid)';
- --执行动态sql
- execute immediate sqlTxt;
(1) 用 select XX into xx 给变量赋值
- select count(1) into v_count from A t where t.A = 'aaa';
(2) 直接赋值
- V_TEST: =123;
- WHILE V_TEST=1 LOOP
- BEGIN
- XXXX
- END;
- END LOOP;
在判断语句前最好先用 count(*)函数判断是否存在该条操作记录
- --判断是否存在,v_count是定义的数值变量
- select count(1)
- into v_count
- from A t
- where t.A='aaa';
- if v_count = 0 then
- else
- end if;
来源: http://www.cnblogs.com/yx007/p/7340221.html