一个项目引出的对ORACLE中带参视图、存储过程、函数、程序包的使用

Oracle-存储过程 oracle中存储过程各种写法 阅读详情


公司做一个项目,因为公司尽量希望能够在前台处理事件,领导的心思,你永远不懂,于是尽可能的把事件放到数据库处理。。。反正我是这样干的

1、自定义函数

-----------------------------------------------------------------------------官方

定义:

CREATE OR REPLACE FUNCTION function_name /*函数名称*/

(
Parameter_name1,mode1 datatype1,            /*参数定义部分*/
Parameter_name2,mode2 datatype2,
Parameter_name3,mode3 datatype3
…
)
RETURN return_datatype                /*定义返回值类型*/
IS/AS
BEGIN
       Function_body                  /*函数体部分*/
      RETURN scalar_expression                        /*返回语句*/
END function_name;

说明:
function_name::用户定义的函数名。函数名必须符合标示符的定义规则,对其所有者来说,该名在数据库中是唯一的。
parameter:用户定义的参数。用户可以定义一个或多个参数。
mode:参数类型。
datatype:用户定义参数的数据类型。
return_type::用户返回值的数据类型。
函数返回scalar_expression表达式的值,function_body函数体由pl/sql语句构成。

---------------------------------------------------------------------------------------------------------------------项目实例



目的:查出数据库某个表的最大id,然后生成小于此id的值,譬如max(id)=8,那么生成一列为1,2,3,4,5,6,7

    主要是为了解决缺失编号问题,因为项目需要,暂时想起这么一个办法。

CREATE OR REPLACE FUNCTION BHBL--(ajh in integer)--不带参数的函数
return varchar
IS
       i number;--声明变量
       k number;
       ajh_ varchar(20);
BEGIN
select max(to_number(ajh)) into k from da_xzdabh 
where SF_FLH=p_view_param.get_FLH() and SF_sszy=p_view_param.get_SSZY()--这里调用了包
and MLH=p_view_param.get_MLH() and del=0;                              --这个SQL的作用是把查出的最大ajh赋值给k          
       i:=0;
       --k:=ajh;
    while i<k loop<span style="white-space:pre">	</span>--while循环
    i:=i+1;
    ajh_:=ajh_||i||',';--拼凑ajh_,
--select count(*) into ajh_ from DA_XZDABH;
end loop;
    ajh_:=substr(ajh_,1,length(ajh_)-1);
       return(ajh_);
END BHBL;

2、存储过程

--------------------------------------------------------------------------网络

CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

--------------------------------------------------------------------------项目实例

目的:因为在新增数据的时候需要两个表数据同步,后台调存储过程是写好的方法,自己是不能写后台的,所以有了这个存储过程,同时插入三个表的数据

CREATE OR REPLACE PROCEDURE DA_proAddBH(oid  integer,qajh_s in integer,zajh_s in integer)--res_num out integer)--in为输入参数,out为输出参数
as
  qzh_ NVARCHAR2(300);--声明变量
  mlh_ varchar2(20);
  sf_flh_ varchar2(20);
  sf_sszy_ varchar2(20);
  qajh_ varchar2(20);
  zajh_ varchar2(20);
  zlsj_ varchar2(20);
  dazjsj_ varchar2(20);
  sf_dazlr_ varchar2(20);
  sf_dazjy_ varchar2(20);
  ajh_ varchar2(20);
    czy_ varchar2(20);
  dabh_ varchar2(20);
  j number;
  i number;
  k number;
  l number;
  m number;
  n number;
  w number;
  y number;
  z number;
  oid_ number;
begin
   oid_:=oid;
   --更新新加入的数据
  update Da_Xzdabh A set ajh=qajh,dabh=(select (p.qzh||'-'||p.mlh||'-'||substr(q.name,0,INSTR(q.name,'|',1,1)-1)||'-'||p.qajh) as dabh  from DA_XZDABH p
  left join sf_flh Q on p.sf_flh=q.no where p.oid=oid_ and rownum=1),btnbc=(select (p.qzh||'-'||p.mlh||'-'||substr(q.name,0,INSTR(q.name,'|',1,1)-1)||'-') as btnbc  from DA_XZDABH p
  left join sf_flh Q on p.sf_flh=q.no where p.oid=oid_ and rownum=1)
  where A.oid=oid_ ;
  commit;
  --给定义的变量赋值
  select  qzh,mlh,sf_flh,sf_sszy,qajh,zajh,zlsj,dazjsj,sf_dazlr,sf_dazjy,ajh,btnbc,czy
  into qzh_,mlh_,sf_flh_,sf_sszy_,qajh_,zajh_,zlsj_,dazjsj_,sf_dazlr_,sf_dazjy_,ajh_,dabh_,czy_
  from Da_Xzdabh where oid=oid_ and rownum=1;
  --select Dabh into dabh_ from

  --res_num:=qzh_;
  --------------------------------
  j:=qajh_s;
  i:=zajh_s-qajh_s;
  k:=0;
  if i<=200 then
  --循环插入数据新增档案编号
 while k<i loop
     j:=j+1;
     k:=k+1;
		 insert into Da_Xzdabh(rdt,oid,qzh,mlh,Sf_Flh,Sf_Sszy,Qajh,zajh,zlsj,dazjsj,Sf_Dazlr,Sf_Dazjy,Ajh,Dabh,Czy)values
    (to_char(sysdate,'yyyy-mm-dd'),DA_XZDABH_OID.nextval,qzh_,mlh_,sf_flh_,sf_sszy_,qajh_s,zajh_s,to_char(sysdate,'yyyy-mm-dd'),to_char(sysdate,'yyyy-mm-dd'),sf_dazlr_,sf_dazjy_,j,dabh_||j,czy_);
    commit;
end loop;
-----------------------------------
  l:=qajh_s;
  m:=zajh_s-qajh_s;
  n:=0;
  --循环插入数据著录索引表
 while n<=m loop
     l:=l+1;
     n:=n+1;
      insert into Da_ZLSY(rdt,oid,qzh,mlh,Sf_SYFlh,Sf_SYSszy,zlsj,dazhijiansj,dazlr,dazjy,Ajh,Dabh,Czy)values--,Dabh
    (to_char(sysdate,'yyyy-mm-dd'),da_ZLSY_oid.nextval,qzh_,mlh_,sf_flh_,sf_sszy_,to_char(sysdate,'yyyy-mm-dd'),to_char(sysdate,'yyyy-mm-dd'),sf_dazlr_,sf_dazjy_,l-1,dabh_||(l-1),czy_);
    commit;
     end loop;
-----------------------------------
  w:=qajh_s;
  y:=zajh_s-qajh_s;
  z:=0;
  --循环插入ND101节点模拟发送数据
 while z<=y loop
     w:=w+1;
     z:=z+1;
      insert into ND101(oid,FID,RDT,CDT,REC,MYNUM,FK_DEPT,TITLE,PRI,FK_NY,EMPS)values--,Dabh
    (DA_NO101_OID.nextval,0,to_char(sysdate,'yyyy-mm-dd'),to_char(sysdate,'yyyy-mm-dd'),czy_,1,'1',to_char(sysdate,'yyyy-mm-dd')||'发起',2,'',czy_);
    commit;
     end loop;
end if;
END ;

3、程序包

目的:为了写带参数的视图而建的,类似于C#中的读写属性,set,get;

注意:程序包包含声明和程序包体两部分;

声明

create or replace package p_view_param  is
       --参数一
   function set_FLH(flh varchar2) return varchar2;
   function get_FLH  return varchar2;
   --参数二
   function set_SSZY(sszy varchar2) return varchar2;
   function get_SSZY  return varchar2;
   --参数三
    --参数二
   function set_MLH(MLH varchar2) return varchar2;
   function get_MLH  return varchar2;
   end p_view_param;

程序包Body

create or replace package body p_view_param is
       paramFLH varchar2(20);
       paramSSZY varchar2(20);
       paramMLH varchar2(20);
       -- Param
       function set_FLH(flh varchar2) return varchar2 is
       begin
         paramFLH:=flh;
         return flh;
        end;

       function get_FLH return varchar2 is
       begin
         return paramFLH;
       end;
       -- Type
       function set_SSZY(sszy varchar2) return varchar2 is
       begin
         paramSSZY:=sszy;
         return sszy;
        end;

       function get_SSZY return varchar2 is
       begin
         return paramSSZY;
       end;
        function set_MLH(MLH varchar2) return varchar2 is
       begin
         paramMLH:=MLH;
         return MLH;
        end;

       function get_MLH return varchar2 is
       begin
         return paramMLH;
       end;
   end p_view_param;
4、带参数的视图

目的:需要通过传过来的查询条件动态生成视图,

用的时候这么用SQL:

select * from v_qsajhlb where 1=1 and  p_view_param.set_MLH('1')='1' and  p_view_param.set_FLH('01')='01' and p_view_param.set_SSZY('02')='02';

这样写的目的是通过p_view_param.set_MLH('1')让p_view_param.get_MLH()=‘1’;

create or replace view v_qsajhlb as
select rownum as XH,'B063' as QZH,A."AJH"
,l.name as sf_flh,
m.name as sf_sszy
,p_view_param.get_MLH() as MLH,
('B063-'||p_view_param.get_MLH()||'-'||substr(l.name,0,INSTR(l.name,'|',1,1)-1)||'-'||a.ajh) as dabh,
'?FK_Flow='||'001'||'&'||'FK_Node='||101||'&'||'FID='||0
  ||'&'||'WorkID='||0  --注释:OID目前没有赋予值
  ||'&'||'IsEdit=1'||'&'||'IsRead=0'|| '&'||'Fk_Frmsort=09'|| '&'||'TableName=da_xzdabh' AS Args
from
(select distinct to_number(regexp_substr(bhbl,'[^,]+',1,level)) as ajh from dual --注意看:这里的bhbl是调的起始的函数
connect by level<=length(bhbl)-length(replace(bhbl,',',''))+1
minus
select to_number(ajh) from da_xzdabh where
sf_flh=p_view_param.get_FLH() and sf_sszy=p_view_param.get_SSZY()
and MLH=p_view_param.get_MLH() and del=0
) A
 left join sf_flh l on p_view_param.get_FLH()=l.NO
 left join sf_sszy m on p_view_param.get_SSZY()=m.no;
5、序号Sequence

目的:在存储过程中进行了调用,来生成唯一的id

sequence
-- Create sequence 
create sequence DA_XZDABH_OID
minvalue 1
maxvalue 999999999999999999999999999
start with 41
increment by 1
cache 20;





导出ORACLE中指定的程序包\视图等. 最近由于项目原因需要导出系统中有所的客户化程序包\视图\触发器等,试了不少办法,感觉使用dbms_metadata来导入ddl是最为方便的,代码中为了防止utl_file输出溢出采用了raw转换,如果大家觉得还有更好的方法也可以提出来一起讨论. 首先需要在服务器上创建好需要导出 阅读详情

相关推荐

oracle实现带参数视图

oracle实现带参数视图,里面有例子,很好的一个东西。

oracle包体全局变量赋值,package中全局变量特性

Oracle中的package对象是其他数据库中所不存在的特性之一,这是oracle面向对象编程的一种体现.我们可以像定义面向对象语言的对象一样定义oracle的package.并为package定义对应的属性(全局变量)全局变量(可以定义在包头,也可以在包体,赋值一定在包体)和方法(function,procedure).package的全局变量在oracle编程过程中有很多有趣并非常实用的作用...

weixin_36057489的博客 1845

Oracle创建带有参数的视图代码介绍

主要介绍了Oracle创建带有参数的视图代码介绍,简介地介绍了创建方法,具有一定参考价值,需要的朋友可以了解下。

ORACLE 定义可以带参数的视图

Oracle view 带参数的视图

qq_45808673的博客 2093

STM32H745xI双核芯片SMPS/LDO配置误区:从复位失败到精准排查的实战复盘

本文详细分析了STM32H745xI双核芯片在SMPS/LDO配置中的常见误区,特别是复位失败问题的排查过程。通过对比参考板与故障板的波形数据,揭示了电感选型不当导致的电源稳定性问题,并提供了硬件设计检查清单和调试技巧,帮助开发者避免类似陷阱。

weixin_42531588的博客 265

物联网开发笔记(34)- 使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

zhusongziye的博客 1万+

oracle如何写一个带参数的视图

--视图的sql部分按照你的需求去写,要用的参数就用包体的get方法去取。------------ 查询视图。--创建包体,写赋值方法。

dandelionoooo的博客 1950

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块

欧姆龙耦合器(NX-ECC201)和高速计数模块(NX-EC0132)单独使用。扫描设备添加到Codesys中,会报错,无法自动添加。记录一下,以防忘记。高速的计数保证了位置的准确性,位置准确就能保证裁切的精度,一切的基础就在这儿了,奈何目前只有欧姆龙和倍福能做到这样的波形。

qq_35316470的博客 1388

如何实现ORACLE带参数视图

 ORACLE数据库中,视图是不能带参数的。但总有一些情况下,我们想让ORACLE中的视图能加入参数,这样能给我们查询数据带来一些便利。比如,眼下我面对这这样一个问题:要打印一张报表,报表的数据源是ORACLE视图。现在,随着数据量的增大,打印报表的速度越来越慢了。所以首先想到了如何优化视图,视图的基表为3张表,表A几百条数据,表B大约3万条数据,表C大约60万条数据,其中表C每月大约增加3万条数

eigo的聊哥儿 2万+

ZYNQ实战:手把手教你用AXI4-Full IP核打通PL与PS的DDR数据通道

本文提供了一份详细的ZYNQ实战指南,手把手教你创建并使用具备AXI4-Full Master接口的自定义IP核,实现PL(可编程逻辑)通过AXI HP接口直接读写PS(处理系统)的DDR内存。文章涵盖了从Vivado硬件设计、IP核配置、地址映射到Vitis软件验证的完整流程,并深入解析了数据一致性(禁用Cache)等关键要点,旨在帮助开发者掌握ZYNQ异构计算中高效数据搬运的核心技术。

weixin_29193359的博客 284

还在纠结二层交换机和三层交换机的区别?这篇文章帮你讲明白!

你好,这里是网络技术联盟站,我是瑞哥。公众号后台有小伙伴想要写一篇文章具体介绍一下二层交换机和三层交换机,此类的文章,之前写过几篇,今天瑞哥再写一篇,希望对大家有所帮助!

网络技术联盟站 4441

Oracle 常用脚本之查看视图、序列、存储过程、触发器、同义词、计划任务等信息

介绍如何通过 Oracle 数据字典查看视图、序列、存储过程/函数、程序包、触发器、同义词、计划任务以及对象之间的依赖关系等信息。

Tony.Dong的专栏 4079

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 521

Oracle回顾--存储过程、函数、程序包

看完了两天了,却因为各种事情到现在才有时间来写博客,方便日后查看了…… PL/SQL的子程序有两种形式,即过程和函数,过程与函数的区别在于函数有返回值,可以向调用者返回执行结果,而过程没有返回值。 一、存储过程 存储过程是一段存储在数据库中执行某功能的程序。是将一些固定的操作集中起来由Oracle数据库服务器来完成,以实现某个任务,是Oracle开发者在数据转换或查询报表时经常使

cxx_317的博客 668

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

由匿名块引出:函数、存储过程。视图、序列

/**1.plsql语句是匿名块,并且不能在数据库中永久的保存,因为我们要对匿名块进行封装  1.1匿名块的缺点:相应的语句不能永久的保存到服务器中,复用性太差(不可能保存到客户端,都是保存到服务器端)  1.2为了解决这个问题:引入了函数和存储过程,都是对匿名块的封装**/----1.无参函数,比较两个数的大小 create or replace function maxNum -----注...

飞天小神猪 588

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Oracle逻辑块之存储过程,函数,重载,视图以及调试测试

目录 1 首先创建一个函数,创建后在左边窗口找到它 2 右键单击选择到的函数,选择编辑或者查看 3 不过一般选择编辑模式进入,在左侧打断点 4 再次选中上步的函数名字function,选择test模式 5 报错没有权限 1 首先创建一个函数,创建后在左边窗口找到它 2 右键单击选择到的函数,选择编辑或者查看 3 不过一般选择编辑模式进入,在左侧打断点 4 再次选中上...

上善若泪 1427

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python 调用oracle存储过程_oracle存储过程调用package

oracle package包头和package body包体例子程序包1作用是为了实程序模块化2程序包里面可以包含存储过程,函数,变量,游标等PL/SQL程序3程序包类似java的jar包,存储过程,函数,变量,游标等相当jar包提供的方法4调用程序包里面的存储过程,函数等元素时,oracle会把程序包调入内存,下次是使用,直接从内存读取。...文章技术小胖子2017-11-091453浏览量J...

weixin_33628926的博客 1125

视图、存储过程与函数

数据库操作封装三要素:视图、存储过程和函数 视图(View)是虚拟表,不存储数据但提供动态查询窗口,用于简化复杂查询、实现数据安全和保持逻辑独立性。存储过程(Stored Procedure)是数据库中的自动化脚本,封装业务逻辑和事务操作,支持参数传递和过程化控制。函数(Function)是可嵌入表达式的计算单元,必须返回确定值。这三者共同实现了数据操作的封装与抽象,使系统更安全高效。视图适合简化查询,存储过程适合多步事务,函数适合计算场景。使用时需注意:视图更新有限制,存储过程事务行为因数据库而异

小李同学的博客 1103

python 调用oracle存储过程_oracle存储过程package

oracle package包头和package body包体例子程序包1作用是为了实程序模块化2程序包里面可以包含存储过程,函数,变量,游标等PL/SQL程序3程序包类似java的jar包,存储过程,函数,变量,游标等相当jar包提供的方法4调用程序包里面的存储过程,函数等元素时,oracle会把程序包调入内存,下次是使用,直接从内存读取。...文章技术小胖子2017-11-091408浏览量J...

weixin_39880623的博客 902

orcle带参视图的创建和使用

oracle带参视图使用方式 步骤一 创建包 CREATE OR REPLACE package p_view_reqParam is –定义开始日期– function set_X(X varchar2) return varchar2; function get_X return varchar2; –定义结束日期– function set_Y(Y varchar2) return varchar2; function get_Y return varchar2; end p_view_reqPar

qq_36413913的博客 415

oracle 索引,视图,存储过程,触发器 函数

Oracle索引?   目地:更快地检索数据。   特点:读取数据速度快,但添加数据速度慢.。   语法:   create index idx_stu_email on stu (email) ;   drop index idx_stu_email ;   sel

xiashan17的专栏 932

oracle 存储过程、存储函数、程序包

oracle数据库对象:表、视图、索引、序列、同义词、存储过程、存储函数等都是数据库对象 存储在数据库中供用户程序 调用的子程序叫:存储过程或者存储函数   相同点:完成特定功能的程序   区别:存储函数用return语句返回值 一般来讲:如果只有一个返回值,则用存储函数,否则(有多个或者没有返回值),使用存储过程 语法: create or replace procedure

世事如棋__2016的博客 726

Oracle 视图、存储过程、函数、序列、索引、同义词、触发器

它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。从表中抽出的逻辑上相关的数据集合,视图是一种虚表,视图是建立在已有表的基础之上,视图赖以建立的这些表称为基表。提高查询效率,一种独立与表的模式对象,可以存储在于表不同的磁盘或表空间,索引损坏只影响查询速度。【总结】:函数与存储过程的区别:执行方式略有不同,存储过程的执行方式有两种(①:使用。),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在。视图中的数据会随着基表的变化而变化。

程序猿进阶 1549

oracle视图传多个参数

oracle 视图传参

互联网编程爱好者 2194
上一篇: Grid++ Reprot报表自动换行设置
下一篇: JSONP跨域原理和jQuery.getJSON用法
难得自然萌
博客等级 码龄15年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值