存储过程
注 :
(1)在procedure中想用ddl,就必须用execute immediat 'create table text1(id int not null primary key)';
且必须显授权(grant create any table to 用户名),否则报'insufficient privileges',无权限.
(2)每条语句都需以';'结尾.
1.基本语法 : 创建一个存储过程,如果存在就覆盖. (注:as/is没区别,只是兼容别的SQL而已)
create or replace procedure 过程名(参数1 in number ,参数2 in number) is
变量1 integer:=0;
变量2 date;
exp exception; --定义异常
begin
--存储过程中调用DDL,必须用动态SQL方法
execute immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';
execute immediate 'insert into testtable values(1,110) ';
raise exp; --抛出异常
exception --异常处理
when exp then
dbms_output.put_line( '执行成功1 '); --控制台打印
when others then
dbms_output.put_line( '执行失败0 ');
end;
2.基本语句:
(1)变量赋值
<1>变量初始化赋值:=值;
<2>变量赋值: select ....into... from ....; --select ... from ... 方法在存储过程中时的格式
select name1,name2 into var1,var2 from table1
(2)For 循环
For ... in ... LOOP
--执行语句
end LOOP;
<1>循环遍历游标
create or replace procedure test() as
Cursor cursor is select name from student; name varchar(20);
begin
for name in cursor LOOP
begin
dbms_output.putline(name);
end;
end LOOP;
end test;
<2>循环遍历数组
create or replace procedure test(varArray in myPackage.TestArray) as
--(输入参数varArray 是自定义的数组类型,定义方式见标题6)
i number;
begin
i := 1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。因为在Oracle中本是没有数组
的概念的,数组其实就是一张
--表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历
for i in 1..varArray.count LOOP
dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));
end LOOP;
end test;
3.代码抛出异常用raise (异常名);
4.游标 :
(1)系统级游标:cursor SYS_REFCURSOR;只能通过open方法打开和赋值
OPEN cursor FOR select name1,name2 from table1 where a='1'; --sql语法
LOOP
FETCH cursor INTO name1,name2; --只能通过fetch into 打开和遍历
exit when cursor%NOTFOUND; --可用三个状态:%NOTFOUND(未找到记录);%FOUND(找到记
录);%ROWCOUNT(当前游标指向的行位置)
dbms_output.putline(name1||name2);
END LOOP;
5.连接运算符 : || ,即'ABC'||'123' : ABC123
6.单行注释: --;多行:/**/;
posted on 2011-06-20 17:12
紫蝶∏飛揚↗ 阅读(984)
评论(0) 编辑 收藏 所属分类:
数据库