日期:2014-05-16  浏览次数:20705 次

Oracle 存储过程笔记

?

写Oracle存储过程习惯用PL/Sql dev,里面有一些模版,我这里也记录一些目前经常使用的一些:
--基本例子
create or replace procedure TestProc as
begin
? for c in (select fieldName from tableName)
? loop
? ? ??dbms_output.put_line(c.fieldName);
? end loop;
endTestProc? ;

--带异常处理
create or replace procedure test2 as
--局部变量
? vc varchar2(2048);
begin
? --过程体卸载这里
Raise?cust_exception;
? -- 异常处理??
EXCEPTION
? when cust_exception then
?????? dbms_output.put_line('custom exception');
? WHEN OTHERS THEN
??? --回滚
??? ROLLBACK;
??? dbms_output.put_line('Other Errors');
??? RETURN;
??? --END;
end test2;

--匿名过程,常用于临时处理数据
DECLARE
--局部变量
l_elem MDSYS.SDO_ELEM_INFO_ARRAY;
l_ord MDSYS.SDO_ORDINATE_ARRAY;
l_srid NUMBER := 262148; -- Arbritrary X-Y Meters
l_gtype NUMBER := 2002; -- 2d Line
j NUMBER;
x NUMBER;
y NUMBER;
BEGIN

l_elem := MDSYS.SDO_ELEM_INFO_ARRAY();
l_ord := MDSYS.SDO_ORDINATE_ARRAY();
l_elem.EXTEND(3);
l_elem(1) := 1;
l_elem(2) := 2; -- etype line
l_elem(3) := 1; -- interpretation straight segments
--for循环
for j in 1 .. 1500 LOOP
x := j;
y := mod(j, 2);
l_ord.EXTEND(2);
l_ord(l_ord.LAST - 1) := x;
l_ord(l_ord.LAST) := y;
END LOOP;
INSERT INTO SHAPELY (entid, coordinates)
values ('BINDVAR', MDSYS.SDO_GEOMETRY(l_gtype, l_srid, NULL,l_elem, l_ord) );
end;

--动态游标,带参数,返回值
create or replace function TestProc(v in varchar2) return varchar2 is
? strSql varchar2(4056);--SQL语句
? type rCursor is ref cursor; --游标类型
? cur rCursor;--定义游标
begin
? --拼装语句
? strSql := 'select field1 from tabName where field2 = ' || v;

? open? cur for strSql;
?
?? LOOP
???? dbms_output.put_line(cur.field1);
?? END LOOP;
?? CLOSE cur; --关闭游标
? return('OK');
end TestProc;

我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html