Oracle SQL 创建一个简单的存储过程procedure

发布时间 2023-05-29 11:31:49作者: DbWong_0918

Oracle 简单的创建一个存储过程procedure

如果学过别的语言,例如java,c这些,那么其实很好理解,其实就是面向数据库的操作

简单的例子如下:

--创建或者重写存储过程
create or replace procedure test_procedure(
p_test1 Integer--输入参数
) as

--游标,select不需要into,游标是位于内存的数据集,加快数据操作,可以提升sql执行效率
  cursor maindata is
    select a.test3,a.test4
      from table2 a, table3 o
     where a.test2 = o.test2;

--定义不同类型的变量,需要什么就定义出什么,变量名最好有独特性
  p_integer  integer;
  p_varchar2 varchar2(50);
  p_number   number(9, 6);
  p_date     date;

begin

--for循环,对select的结果进行行遍历,遍历每条记录,使用select不需要into
  for fc in (select o.test2
               from table1 o
              where o.test1 = p_test1) loop
			  
 --for循环,对游标进行展开
	  for fcc in maindata loop
	  
	--普通的select要用into,要将数据存储在变量中进行操作,注意,只有单行数据,多行会报错
      select t.num1
        into p_number
        from table4 t
       where t.num1 = '1';
    
	--插表,select不需要into,在存储过程没有结束前不会commit,也可以再后面加上commit提前commit结束事务
    insert into table_log
      (test1,test2,test3,num1)
      (select fc.test2,
              fcc.test3,
              fcc.test4,
              p_number
         from dual);
		
    end loop;--结束循环
		
  end loop;

--if判断
  if p_number > 0 then
		
 --打印数据在PL/SQL控制台
     dbms_output.put_line('料号:' || sUserCode.itemcode || '组织:' ||sUserCode.invorgid);
	 
         select it.num1
          into p_number
          from table4 it
         where it.num1 = '2';
 
  end if;
	
--异常
exception
  WHEN others THEN
    rollback;
    dbms_output.put_line('ERROR异常:' || SQLERRM);

end;

游标的使用有很多种
常用的有两种,一种是例子中的使用for展开
另一种是OPEN CLOSE的形式展开

  OPEN maindata;
  LOOP
    FETCH maindata
      INTO r;
    EXIT WHEN maindata%notfound;
		
		XXX;
		
  END LOOP;
  CLOSE c;

如果想把数据放在临时表中,在PL/SQL中,可以

--定义一个临时表
  TYPE g_tbl IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
;
--定义一个变量
    v_tbl      g_tbl;
;
--for循环存数据
    FOR r_v_tbl IN 游标或(select语句) LOOP
      v_tbl(i) := r_v_tbl.value;
      i := i + 1;
    end loop;