Oracle和SQLServer分别使用函数和存储过程返回结果集

什么是存储过程和函数? 存储过程和函数都是数据库中的一种对象,用于存储和重复使用一组SQL语句。它们都可以提高代码的复用性和执行效率,并在数据库中起到重要的作用。 阅读详情

我们知道,SQLServer无论是函数还是存储过程,其返回结果集都是较为简单的,在这里我们就不多加说明了,下面我们将通过实例详细分析一下Oracle的函数和存储过程返回结果集的方法:

1、函数

首先创建某一个对象类型如下:

CREATE OR REPLACE TYPE "NS_FB_BUSINESS_SPECIALVAL_ROW"                                                                                                                                                                                                                                                                                                                                                                       AS OBJECT
(
  BID INTEGER,
  BIZ_TYPE VARCHAR2(4),
  CONTRACT_NO    VARCHAR2(32),
  DEBTOR INTEGER,
  CURRENCY_NO   VARCHAR2(4),
  START_DATE   DATE,
  MATURITY  DATE,
  STATE      INTEGER,
  SUB_STATE  INTEGER,
  SPEVAL NUMBER(15,2),
  special_list_id INTEGER,
  ledger_type VARCHAR2(4),
  loanTerm VARCHAR(64),
  LOANTERMNAME VARCHAR(256),
  CORPNO VARCHAR2(32),
  CORPNAME VARCHAR2(100),
  CRGRADE VARCHAR2(32),
  self_support INTEGER
)

然后,创建一表类型如下:

CREATE OR REPLACE TYPE "NS_FB_BUSINESS_SPECIALVAL_TAB" AS TABLE OF NS_FB_BUSINESS_SPECIALVAL_ROW

紧接着我们要创建一函数如下:

CREATE OR REPLACE FUNCTION NS_FB_BUSINESS_SPECIAL_VAL(pDate_ IN DATE DEFAULT NULL)
  RETURN NS_FB_BUSINESS_SPECIALVAL_TAB PIPELINED
  IS
  SepcialVal NS_FB_BUSINESS_SPECIALVAL_ROW :=
    NS_FB_BUSINESS_SPECIALVAL_ROW(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
BEGIN
  for rec in(
  select fb.*,
       sval.speval,                 --- 卖断余额
       sval.special_list_id,        --- 卖断明细id
       sval.ledger_type,            --- 卖断台帐类型
       fb_ndqx_func.fb_calLoanTerm(fb.start_date, fb.maturity) as loanTerm,
       --贷款期限 :1:三年以上; 2:三年; 3:一年;4:6个月;5:三个月;6:一个月;
       fb_ndqx_func.fb_calLoanTermName(fb_ndqx_func.fb_calLoanTerm(fb.start_date,
                                                                   fb.maturity)) as loanTermName,
       b.corpno,         --客户编号
       b.corpname,       --客户名称
       b.crgrade,        --信用等级
       fc.self_support
  From fb_business fb
  inner join fb_contracts fc on fb.bid=fc.bid
  inner join (select scl.bid,
                    scl.special_list_id,
                    sl.ledger_type,
                    sum(sl.amount * (case sl.dir_flag
                          when '+' then
                           1
                          else
                           -1
                        end)) as speval
               From fb_special_contract sc
              inner join fb_special_contract_list scl on sc.special_id =
                                                         scl.special_id
              inner join fb_special_ledger sl on sc.special_id =
                                                 sl.special_id
              where sc.biz_type = '114' and sl.ACT_DATE<=pDate_
              group by scl.special_list_id, scl.bid, sl.ledger_type) sval on sval.bid =
                                                                             fb.bid
   join corporations b on fb.debtor = b.corpid
  )
  LOOP
   SepcialVal.BID                   := rec.bid ;
   SepcialVal.BIZ_TYPE              := rec.BIZ_TYPE ;
   SepcialVal.CONTRACT_NO           := rec.CONTRACT_NO ;
   SepcialVal.DEBTOR                := rec.DEBTOR ;
   SepcialVal.CURRENCY_NO           := rec.CURRENCY_NO ;
   SepcialVal.START_DATE            := rec.START_DATE ;
   SepcialVal.MATURITY              := rec.MATURITY ;
   SepcialVal.STATE                 := rec.STATE ;
   SepcialVal.SUB_STATE             := rec.SUB_STATE ;
   SepcialVal.SPEVAL                := rec.SPEVAL ;
   SepcialVal.special_list_id       := rec.special_list_id ;
   SepcialVal.ledger_type           := rec.ledger_type ;
   SepcialVal.loanTerm              := rec.loanTerm ;
   SepcialVal.LOANTERMNAME          := rec.LOANTERMNAME ;
   SepcialVal.CORPNO                := rec.CORPNO ;
   SepcialVal.CORPNAME              := rec.CORPNAME ;
   SepcialVal.CRGRADE               := rec.CRGRADE ;
   SepcialVal.self_support          := rec.self_support;
   PIPE ROW(SepcialVal);
  END LOOP;
  RETURN;
END;

以上操作完成后,我们便可以做下面的查询操作了,

select * from table(NS_FB_BUSINESS_SPECIAL_VAL(temp_Date)) bs

 

2、存储过程

早期版本中可以使用package和ref cursor来返回,10g后可以直接使用SYS_REFCURSOR进行代替。

过程如下:

首先创建一package,

CREATE OR REPLACE PACKAGE GLOBALPKG
AS
    TYPE RCT1 IS REF CURSOR;
    TRANCOUNT INTEGER := 0;
    IDENTITY INTEGER;
  DBLINK  VARCHAR2(2) := 'FN';
END;

然后,创建一存储过程,

CREATE OR REPLACE PROCEDURE NsWsGetCltClassList
(
 Uid_ in int,
GroupNo in  varchar2,
ClassNo varchar2,
RCT1                        IN  OUT     GLOBALPKG.RCT1
)
/** 签名结果 **/
AS
        CCId int;
        CGNo varchar2 (2);
        CCNo varchar2 (18)  ;
        CCName varchar2 (60)  ;
        TreeNo varchar2(18)  ;
        Level_ smallint ;
        FullName varchar2(255)  ;
        Memo varchar (255);
        UserId int;
        ASSIGNMENTVARIABLE0 int;
        CURSOR  cur
         IS
 select a.CCId,a.CGNo,a.CCNo,a.CCName,a.TreeNo,a."LEVEL",a.FullName,a.Memo
         from NsCltClass a
        where a.cgNo = NsWsGetCltClassList.GroupNo
        and a.CCNo like NsWsGetCltClassList.ClassNo || '%';

BEGIN
       EXECUTE IMMEDIATE 'TRUNCATE TABLE NsWsGetCltClassList_TBL';
       OPEN cur;
       while 1=1 loop
             fetch  cur into CCId,CGNo,CCNo,CCName,TreeNo,Level_,FullName,Memo ;
             if cur%NOTFOUND then
                exit;
             end if;
         BEGIN
              select count(*)  into ASSIGNMENTVARIABLE0  from WSClientACL
            where ccid in  ( select ccid from
                      NsCltClass
                      where CgNo = NsWsGetCltClassList.GroupNo
                      and Uid = NsWsGetCltClassList.Uid_
                      and NsWsGetCltClassList.TreeNo  like TreeNo || '%' )       ; 
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                ASSIGNMENTVARIABLE0 := 0;
        END;
           if ASSIGNMENTVARIABLE0 >0 then
               UserId := NsWsGetCltClassList.Uid_;
            else
               UserId :=0;
            end if;
            insert into NsWsGetCltClassList_TBL(CCId,CGNo,CCNo,CCName,TreeNo,Level_,FullName,Memo,UId_)
          values(NsWsGetCltClassList.CCId,NsWsGetCltClassList.CGNo,NsWsGetCltClassList.CCNo,NsWsGetCltClassList.CCName,NsWsGetCltClassList.TreeNo,NsWsGetCltClassList.Level_,NsWsGetCltClassList.FullName,NsWsGetCltClassList.Memo,NsWsGetCltClassList.UserId);
       end loop;
       open RCT1 for
         select * from NsWsGetCltClassList_TBL
    order by TreeNo, Level_;
END;

以上操作完成后,便可以进行执行操作了。


 

SqlServer,Oracle和MySQL SqlServer,Oracle和MySQL一、SqlServer1、SqlServer简介2、SqlServer的安装步骤3、日志文件和数据文件4、新建和删除数据库5、数据库的完整性6、数据库的类型、语句关键词、运算符、函数7、SqlServer增删改查语句二、Oracle1、Oracle简介2、oracle安装步骤3、oracle存储过程的增删改4、存储过程和函数的区别1、过程2、函数三、MySQL1、mysql简介2、术语3、MySQL安装步骤4、开启服务1、在计算管理里面启动和关闭服务2、在mysq 阅读详情

相关推荐

SQL Server存储过程同时返回分页结果集和总数

前言       好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,返回分页结果集的同时还需要返回记录总数给客户端。       我对于这样一个业务存储过程总结如下:1、内核层,通常也就是要查询的字段或者要计算的字段,这部分单独拿出来。  2、查询条件层。 如果内核只是查询一些字段的话,条件可以放在查询条件层拼接。 如果内核层完全是统计业务逻辑,那么查询条件则必须要放在内核层,像我们常用的SUM、GROUPBY 业务。 3、添加分页参数(也就是我们现

sqlserver,获取调用存储过程返回数据的方法。

sqlserver,获取调用存储过程返回数据的方法。 1,获取存储过程最后select返回的结果集。SELECT 数据集返回值。 因为select返回的结果是一个表。所以返回的结果需要用一个表接收。使用临时表接收。 被调用的存储过程最后是这样:返回了一个空标题的字段。 什么都不处理,调用存储过程,发现是这样: ALTER PROCEDURE [LC0**999].[ERP_**...

thre3stone的博客 8431

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6861

子查询、存储过程、视图

子查询:把内层的查询结果供外层使用,先执行内层,再执行外层,先做内层,再做外层 例:查询比Tom小的所有学生的信息 SELECT * FROM student WHERE birthday&amp;gt; ( SELECT birthday FROM student WHERE name='Tom' 找出Tom的出生日期 ); 存储过程: CREATE PROCEDURE 存储过程名字(参数) BEG...

Viscoxx的博客 729

【无人机对抗】基于matlab无人机红蓝对抗仿真【含Matlab源码 4436期】

无人机红蓝对抗仿真 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab3024528700的博客 1379

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

SQLServer存储过程的返回值 查询分析器/程序

1.存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)如果通过查询分析器执行该存储过程,在显示栏中如果有影响的行数,则影响几行count就是几(2)如果通过查询分析器执行该存储过程,在显示栏中如果显示'命令已成功完成。'则count = -1;在显示栏中如果有查询...

weixin_30293079的博客 331

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

存储过程中的行集作为子查询

  存储过程中的行集作为子查询可以使用Openrowset,但Openrowset不支持参数话的语句,要实现参数只能在客户端程序中把要的最终语句拼接好传入。实际应用中,我用openrowset连接ssas服务器来和sqlserver数据库对象实现交互。测试语句如下: use tempdb go create proc p_test as begin     select 1 as a ,

三断笛 876

Unity3D实战:5分钟搞定RTSP监控视频播放(附完整代码)

本文提供了一套在Unity3D中快速集成RTSP监控视频播放的实战方案。通过采用LibVLCSharp for Unity这一成熟稳定的跨平台中间件,开发者可以轻松实现RTSP流的解码与渲染,并附有完整的C#代码示例,帮助用户在5分钟内完成集成,适用于智慧园区、安防监控等3D可视化场景。

weixin_29001655的博客 191

Spring AI 实战(11):收官!10 道面试高频题 + 一张脑图带走全系列

本文是Spring AI系列的收官篇,通过知识脑图梳理前10篇内容,提供面试高频题和避坑清单。主要内容包括: 知识脑图:分6层(核心抽象、输入增强、输出控制等)总结Spring AI全栈技术。 10道高频面试题:涵盖ChatClient/ChatModel关系、结构化输出、RAG链路等核心知识点。 避坑清单:列出9条常见问题及解决方案,如向量维度匹配、Advisor顺序等。 技术对比:分析Spring AI、LangChain4j和Spring AI Alibaba的差异与适用场景。 使用建议:提供面试复习

不才不才不不才的博客 296

sql调用oracle数据库,SQLServer 调用 ORACLE 数据库资源

首先要在sqlserver中创建Oracle的服务器连接。以下以服务器连接“GW_ORCL”为例介绍。 1.查询表。 查询表有两种方法: 第一种 :select * from GW_ORCL..JKJK.TB_MEDICAL_APPOINTMENT; 解析:1.在服务器连接“GW_ORCL”后有两个小点; 2.两个小点之后的“JKJ首先要在sqlserver中创建Oracle的服务器连接。以下以服...

weixin_34749183的博客 642

置顶必读(1) |《YOLOv8实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 14万+

Microsoft SQL Server 2005 查询分页

微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程。新的数据库分页功能的核心是一个叫row_number的函数具体如下: 返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 语法 ROW_NUMBER ( )     OVER ( [ &lt;partition_by_clause&gt; ] &lt;order_by_clau...

weixin_34189116的博客 151

PCB高速信号换层孔新技术:VECS(Vertical Conductive Structure Technology)解析

摘要:垂直导电结构(VeCS)是一种新型PCB互连技术,由平板信号走线和椭圆形接地层构成半同轴结构,相比传统过孔具有显著优势。通过全波仿真和实测验证,VeCS展现出更好的阻抗连续性、更低的插入损耗和回波损耗,以及优异的串扰抑制能力。其椭圆形接地结构能有效隔离电磁干扰,在相同布线密度下远端串扰比传统过孔降低约50%。VeCS制备工艺与传统PCB工艺兼容,无需新增设备,且能实现更高密度互连。测试结果显示,2.5英寸带状线通道中VeCS结构的信号完整性表现明显优于传统过孔,为高速数字系统提供了更可靠的垂直互连解决

小孟同学的博客 201

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SQLServer和ORACLE 存储过程的调用(返回结果集)

SQLServer相比Oracle是很随便的,存储过程里select * from tb 就能返回一个结果集出来。在C#里调用时,能exec proc直接出结果集。 --SQL中返回结果集的存储过程:create proc retable(@i int)asbeginselect * from a where id=@iendGO //C#里调用存储过程返回结果集的一种简便

siegebaoniu的专栏 4597

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多。 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了。 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR

a406502972的专栏 1172

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

oracle怎么存储判断结果集,Oracle中返回结果集的存储过程分享

Oracle不像SQLServer那样在存储过程中用Select就可以返回结果集,而是通过Out型的参数进行结果集返回的。实际上是利用REF CURSOR复制代码代码如下:--procedure返回记录集:----------------------声明一个Package--------------CREATE OR REPLACE PACKAGE pkg_testASTYPEmyrctypeIS...

weixin_39778815的博客 376

oracle存储过程返回数据集结果

MSSQL的存储过程返回数据集好简单,直接SELECT 就可以。 ORACLE的存储过程返回数据集必须通过游标。 创建ORACLE存储过程 create or replace procedure cxg_test(out_var out sys_refcursor)  is   begin    open out_var for select * from a;  end; 调用ORACLE...

weixin_33716557的博客 933

Java获取Oracle存储过程中执行查询返回的结果集

通过JAVA调用ORACLE的存储过程,在ORACLE的存储过程内部做了一个查询在JAVA中获取该查询结果,这个和SYBASE、SQLSERVER的获取不一样,等我的下一篇文章我会介绍如何获取SYBASE、SQLSERVER在存储过程中执行了查询后如何获取其结果及存储过程的编写。 在Oracle中需要返回查询结果集,必须将其以游标的形式返回,但游标又不是基础类型,因而不能够像返回字符类型一样直接

冯立彬的博客 8095

oracle存储过程查询多列,greenplum 存储过程 返回结果集多列和单列

PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)(转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...oracle 存储过程返回结果集 (转载)好久没上来了, 难道今天...

weixin_42511177的博客 603

java如何取得存储过程结果集_Java JDBC里如何取得Oracle存储过程返回的动态结果集...

Java JDBC里如何取得Oracle存储过程返回的动态结果集作者:叶枫版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明作者:叶枫(http://blog.matrix.org.cn/page/叶枫)原文:[http://www.matrix.org.cn/resource/article/43/43999_JDBC_Oracle.html]http://w...

weixin_35067976的博客 222

.NET中使用ORACLE函数和过程并输出参数(3)使用游标返回列表

csdn 标签: oracle,.net,ado.net,FUNCTION,存储过程 使用了游标,返回列表,通过包定义类 SQLSERVER 中 做一个直接获得返回列表的存储 CREATE PROCEDURE [dbo].[test_get] AS SELECT RoleID, Description FROM test_tables ORDER BY Description ASC 测试存储过程 得到返回列表还有

jiayue's BLOG 3110

c# 调用oracle 返回结果集,oracle创建存储过程并返回结果集(附C#调用代码)

使用存储过程中,最常用的莫过于查询数据表,并返回结果集。在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成。但是在Oracle中并不支持这种写法,那么我们怎么实现跟SQL SERVER同样的功能呢?且看以下代码:create or replace proceduresp_getdept(rep_typein varchar2,sel in varcha...

weixin_36254537的博客 715
下一篇: Oracle和SQLServer的“临时表”应用
lb_mail
博客等级 码龄17年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值