Oracle procedure 存储过程

2024-02-18 09:58
文章标签 oracle 过程 存储 procedure

本文主要是介绍Oracle procedure 存储过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Oracle procedure 存储过程

Oracle procedure 基本语法:

CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数 [IN|OUT|INOUT] 数据类型...)]
{IS|AS}
[说明部分,例如:变量声明]
BEGIN 
可执行部分
[EXCEPTION
错误处理部分]
END [存储过程名];
/


-- 创建存储过程
-- create procedure 'testproc'
create or replace procedure testproc
as
  cnt number(38);
begin
  select count(*) into cnt from dual;
  dbms_output.put_line('cnt: '||cnt);
end;
/


注意:
1.在 PROCEDURE 和 FUNCTION 中使用 IS/AS 并没有太大区别。但在 VIEW 中只能用 AS 而不能用 IS ,在 CURSOR 中只能用 IS 而不能用AS。IS/AS 后面一般跟变量声明。 


-- 查询创建的存储过程
col name for a30;
col type for a20;

-- show all
select * from user_source;

-- show some
select * from user_source where name like upper('%test%');

-- show one
select * from user_source where name = upper('testproc');


-- 查询存储过程状态(包括编译成功与否状态)
col object_name for a20;
col subobject_name for a20;
select object_name, status, last_ddl_time, created, timestamp from user_objects where object_name = upper('testproc');


-- 调用存储过程
-- call procedure 'testproc'
set serveroutput on;
begin
  testproc;
end;
/

直接在SQL命令行执行命令调用存储过程
set serveroutput on;
execute testproc;


-- 重新编译存储过程
alter procedure testproc compile;
select object_name, status, last_ddl_time, created, timestamp from user_objects where object_name = upper('testproc');


删除存储过程
drop procedure testpro;

 

使用游标查询多行结果集

SQL Server支持存储过程中使用 select * from  student 来查询结果集,但Oracle不支持,会报错Warning: Procedure  created  with  compilation  errors。
Oracle中可以使用游标来返回结果集合。

-- 查询结果为多行结果集。student表三个字段:id,name,age
create or replace procedure testproc2
is
  cursor cur_all is select id,name,age from student;  --定义游标 cur_all
  c_id student.id%type;     --声明变量分别用来保存查询表的各列
  c_name student.name%type;
  c_age student.age%type;
begin
open cur_all;        --打开游标
  loop                    --循环处理
    fetch cur_all into c_id,c_name,c_age;    --操作数据
    exit when cur_all%NOTFOUND;            --循环退出条件:最近的FETCH语句返回一行数据则为FALSE
    if cur_all%FOUND then                          --最近的FETCH语句返回一行数据则为TRUE
      dbms_output.put_line(c_id||' '||c_name||' '||c_age);
    end if;
  end loop;
close cur_all;     --关闭游标
end;
/

execute testproc2;
1 jack 20
2 lucy 21
3 happy 20
4 white 21
 

--带入参(IN)的存储过程,普通循环1
create or replace procedure testproc2(var1 in varchar2 default 'id name age')
is
  cursor cur_all is select id,name,age from student;  --定义游标 cur_all
  c_id student.id%type;                               --声明变量分别用来保存查询表的各列
  c_name student.name%type;
  c_age student.age%type;
begin
dbms_output.put_line(var1);
open cur_all;                                         --打开游标
  loop                                                --循环处理
    fetch cur_all into c_id,c_name,c_age;             --操作数据
    exit when cur_all%NOTFOUND;                       --循环退出条件:最近的FETCH语句返回一行数据则为FALSE
    if cur_all%FOUND then                             --最近的FETCH语句返回一行数据则为TRUE
      dbms_output.put_line(c_id||' '||c_name||' '||c_age);
    end if;
  end loop;
close cur_all;                                        --关闭游标
end;
/


--带入参(IN)的存储过程,普通循环2
create or replace procedure testproc2(var1 in varchar2 default 'id name age')
is
  cursor cur_all is select * from student;  --定义游标 cur_all
  cur_line student%rowtype;                 --定义rowtype
begin
dbms_output.put_line(var1);
open cur_all;                                         --打开游标
  loop                                                --循环处理
    fetch cur_all into cur_line;                      --操作数据
    exit when cur_all%NOTFOUND;                       --循环退出条件:最近的FETCH语句返回一行数据则为FALSE
    if cur_all%FOUND then                             --最近的FETCH语句返回一行数据则为TRUE
      dbms_output.put_line(cur_line.id||' '||cur_line.name||' '||cur_line.age);
    end if;
  end loop;
close cur_all;                                        --关闭游标
end;
/

 

execute testproc2
id name age
1 jack 20
2 lucy 21
3 happy 20
4 white 21

execute testproc2('id2, name2, age2')
id2, name2, age2
1 jack 20
2 lucy 21
3 happy 20
4 white 21

call testproc2();
id name age
1 jack 20
2 lucy 21
3 happy 20
4 white 21

call testproc2('id3 name3 age3');
id3 name3 age3
1 jack 20
2 lucy 21
3 happy 20
4 white 21
 

--带入参(IN)的存储过程,用"for in"使用cursor(游标)
create or replace procedure testproc2(var1 in varchar2 default 'id name age')
is
  cursor cur_all is select * from student;  --定义游标 cur_all
  cur_line student%rowtype;                 --定义rowtype
begin
dbms_output.put_line(var1);
  for cur_line in cur_all loop              --循环处理,隐式打开游标
    dbms_output.put_line(cur_line.id||' '||cur_line.name||' '||cur_line.age); --隐式执行一个fetch
  end loop;
--隐式关闭游标
end;
/
 

--带入参(IN)的存储过程,用 bulk collect 批量检索,效率更高
create or replace procedure testproc2(var1 in varchar2 default 'id name age')
is
  cursor cur_all is select * from student;      --定义游标 cur_all
  type student_tab is table of student%rowtype; --定义类型 student_tab
  student_rd student_tab;                       --定义变量 student_rd
begin
  dbms_output.put_line(var1);
  open cur_all;
  loop                   --循环处理,隐式打开游标
    fetch cur_all bulk collect into student_rd limit 500;
      for i in 1..student_rd.count loop             --循环处理
        dbms_output.put_line(student_rd(i).id||' '||student_rd(i).name||' '||student_rd(i).age);
      end loop;
    exit when cur_all%NOTFOUND;       --循环退出条件:最近的FETCH语句返回一行数据则为FALSE
  end loop;
  close cur_all;
end;
/
 


--带出参(OUT)的存储过程,简单样例
create or replace procedure testproc2(ret out varchar2)
is
begin
  ret := 'test002';
end;
/

declare
ret varchar2(255):='test001';
begin
  dbms_output.put_line(ret); --ret 原值
  testproc2(ret);
  dbms_output.put_line(ret); --ret 新值
end;
/

输出结果:
test001
test002


--带入参(IN)、出参(OUT)的存储过程,用"for in"使用cursor(游标)
create or replace procedure testproc2(var1 in varchar2 default 'id name age', var2 out varchar2)
is
  cursor cur_all is select * from student;  --定义游标 cur_all
  cur_line student%rowtype;                 --定义rowtype
begin
  dbms_output.put_line(var1);
  for cur_line in cur_all loop              --循环处理,隐式打开游标
    --dbms_output.put_line(cur_line.id||' '||cur_line.name||' '||cur_line.age); --隐式执行一个fetch
    var2 := var2||cur_line.id||' '||cur_line.name||' '||cur_line.age||chr(13)||chr(10);
  end loop;
--隐式关闭游标
end;
/

执行存储过程
declare
  ret varchar2(8000);
begin
  testproc2('id name age', ret);
  dbms_output.put_line(ret);
end;
/

结果如下:

id name age
1 jack 20
2 lucy 21
3 happy 20
4 white 21

 

这篇关于Oracle procedure 存储过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720792

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

Oracle Start With关键字

Oracle Start With关键字 前言 旨在记录一些Oracle使用中遇到的各种各样的问题. 同时希望能帮到和我遇到同样问题的人. Start With (树查询) 问题描述: 在数据库中, 有一种比较常见得 设计模式, 层级结构 设计模式, 具体到 Oracle table中, 字段特点如下: ID, DSC, PID; 三个字段, 分别表示 当前标识的 ID(主键), DSC 当