新建一个简单的存储过程
create or replace PROCEDURE firstPro IS BEGIN dbms_output.put_line('执行了'); 控制台输出 END;
NaviCat运行没问题;
用过程查询表;
create or replace PROCEDURE firstPro IS BEGIN UPDATE DM_DT_DATA_OBJECT t SET t."NAME" = '新建参数1' WHERE t."ID" ='4028810c67befbbe0167bf2140d10002'; END;
调用过程;
BEGIN FirstPro () ; END ;
查询下sql执行用时;
CREATE OR REPLACE procedure testtime is --定义过程变量 n_start number; n_end number; samplenum number; use_time number; begin n_start:=dbms_utility.get_time; select count(*) into samplenum from DM_DT_DATA_OBJECT; n_end:=dbms_utility.get_time; use_time:= n_end - n_start; dbms_output.put_line('查询'||samplenum||'条,用时'|| use_time ||'毫秒'); end;
带参数的过程实例
CREATE OR replace PROCEDURE test_fl(num IN NUMBER,bub IN NUMBER) IS n NUMBER; b NUMBER; BEGIN n := num; b := bub; dbms_output.put_line('输出参数'||n||b); END;
调用(注意的一点是调用是传参类型和过程的参数类型不一致竟然也可以)
DECLARE c VARCHAR(5); b VARCHAR(6); BEGIN c := '888'; b := '666'; test_fl('888','666'); --'=>'指定参数,还可以写成test_fl(c,b)/('888','666') END;
--控制台 输出参数888666
循环插入并打印插入条数
CREATE OR replace PROCEDURE inserttest_wfl AS str NUMBER; endc NUMBER; out NUMBER; cursor dm_db IS SELECT id,name from DM_DT_DATA_OBJECT; BEGIN SELECT COUNT(*) INTO str from TEST_USER_WFL; FOR tamp IN dm_db loop INSERT INTO TEST_USER_WFL("ID","NAME",SEX) VALUES(tamp.id,tamp.name,'1'); END loop; SELECT COUNT(*) INTO endc from TEST_USER_WFL; out := endc - str; dbms_output.put_line(out+1); END;
过程中if判断的应用
CREATE OR replace PROCEDURE iftest_fl(cid in VARCHAR,rname out VARCHAR) AS aid VARCHAR(20); BEGIN aid :=cid; IF (aid ='1') THEN select name into rname from test_user_wfl where id=aid; ELSE dbms_output.put_line('123'); end IF; END;--注意navicat 编辑器 end if;要和 END;写在一行否则会报编译错误ORA-24344 其他工具不详 --调用 DECLARE a VARCHAR(20); b VARCHAR(20); BEGIN a :='1'; iftest_fl(cid=>a,rname=>b); dbms_output.put_line(b);--获取输出参数就是过程返回结果; END;
利用游标过程返回结果集【】
CREATE or replace PROCEDURE out_result_test_wfl(result out sys_refcursor)--定义输出游标类型 IS BEGIN open result for SELECT id,name,sex from test_user_wfl;--游标返回结果集 end; --调用 DECLARE t sys_refcursor; --定义游标 s test_user_wfl%rowtype;--定义数据行类型test_user_wfl=tableName f NUMBER; begin out_result_test_wfl(t); loop FETCH t into s.id,s.name,s.sex; dbms_output.put_line(s.id||s.name||' '||s.sex); exit WHEN t%notfound;--迭代完退出 when 后为退出条件 找不到下一条记录时; end loop; close t; --关闭游标 不关闭会造成死循环 FOR loop 属于隐士游标; end;