第一天写博客,分享下学习oracle存储过程的过程

新建一个简单的存储过程

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;
原文地址:https://www.cnblogs.com/wangfl/p/10244101.html