Oracle 存储过程教程

一个简单的oracle分页存储过程的实现和调用。在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle的存储过程,因为我用到的数据库是oracle。

Oracle分页存储过程的思路于sqlserver的思路是一样的,但是我这里做了点改动,在因为Oracle的语法和规则的不同所以,Oracle分页存储过程看上去有点不一样。见笑,见笑!
在Oracle的存储过程中返回记录集,需要用到游标变量,Oracle不能像sqlserver那样可以直接返回一个记录集。
由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。
以下是在Oracle中实现的分页存储过程。
代码如下:
create or replace package DotNet is
— Author : good_hy
— Created : 2004-12-13 13:30:30
— Purpose :
TYPE type_cur IS REF CURSOR; –定义游标变量用于返回记录集
PROCEDURE DotNetPagination(
Pindex in number, –分页索引
Psql in varchar2, –产生dataset的sql语句
Psize in number, –页面大小
Pcount out number, –返回分页总数
v_cur out type_cur –返回当前页数据记录
);
procedure DotNetPageRecordsCount(
Psqlcount in varchar2, –产生dataset的sql语句
Prcount out number –返回记录总数
);
end DotNot;
create or replace package body DotNet is
–***************************************************************************************
PROCEDURE DotNetPagination(
Pindex in number,
Psql in varchar2,
Psize in number,
Pcount out number,
v_cur out type_cur
)
AS
v_sql VARCHAR2(1000);
v_count number;
v_Plow number;
v_Phei number;
Begin
————————————————————取分页总数
v_sql := ‘select count(*) from (‘ || Psql || ‘)’;
execute immediate v_sql into v_count;
Pcount := ceil(v_count/Psize);
————————————————————显示任意页内容
v_Phei := Pindex * Psize + Psize;
v_Plow := v_Phei – Psize + 1;
–Psql := ‘select rownum rn,t.* from cd_ssxl t’ ; –要求必须包含rownum字段
v_sql := ‘select * from (‘ || Psql || ‘) where rn between ‘ || v_Plow || ‘ and ‘ || v_Phei ;
open v_cur for v_sql;
End DotNetPagination;
–**************************************************************************************
procedure DotNetPageRecordsCount(
Psqlcount in varchar2,
Prcount out number
)
as
v_sql varchar2(1000);
v_prcount number;
begin
v_sql := ‘select count(*) from (‘ || Psqlcount || ‘)’;
execute immediate v_sql into v_prcount;
Prcount := v_prcount; –返回记录总数
end DotNetPageRecordsCount;
–**************************************************************************************
end DotNot;

以下是在.net中调用Oracle分页存储过程的步骤。
在.net调用返回记录集的存储过程,需要用到datareader,但是datareader不支持在datagrid中的分页,因此需要利用datagrid自定义分页功能。
代码如下:
rotected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
Dim conn As New OracleClient.OracleConnection()
Dim cmd As New OracleClient.OracleCommand()
Dim dr As OracleClient.OracleDataReader
Private Sub gridbind(ByVal pindex As Integer, ByVal psql As String, Optional ByVal psize As Integer = 10)
conn.ConnectionString = “Password=gzdlgis;User ID=gzdlgis;Data Source=gzgis”
cmd.Connection = conn
cmd.CommandType = CommandType.StoredProcedure
conn.Open()
‘————————————————————————————
cmd.CommandText = “DotNot.DotNetPageRecordsCount”
‘————————————————————————————
cmd.Parameters.Add(“psqlcount”, OracleType.VarChar).Value = psql
cmd.Parameters.Add(“prcount”, OracleType.Number).Direction = ParameterDirection.Output
cmd.ExecuteNonQuery()
Me.DataGrid1.AllowPaging = True
Me.DataGrid1.AllowCustomPaging = True
Me.DataGrid1.PageSize = psize
Me.DataGrid1.VirtualItemCount = cmd.Parameters(“prcount”).Value
cmd.Parameters.Clear()
‘————————————————————————————
cmd.CommandText = “DotNot.DotNetPagination”
‘————————————————————————————
cmd.Parameters.Add(“pindex”, Data.OracleClient.OracleType.Number).Value = pindex
cmd.Parameters.Add(“psql”, Data.OracleClient.OracleType.VarChar).Value = psql ‘”select rownum rn,t.* from cd_ssxl t”
cmd.Parameters.Add(“psize”, Data.OracleClient.OracleType.Number).Value = psize
cmd.Parameters.Add(“v_cur”, Data.OracleClient.OracleType.Cursor).Direction = ParameterDirection.Output
cmd.Parameters.Add(“pcount”, Data.OracleClient.OracleType.Number).Direction = ParameterDirection.Output
dr = cmd.ExecuteReader()
Me.DataGrid1.DataSource = dr
Me.DataGrid1.DataBind()
dr.Close()
conn.Close()
Response.Write(“总计页数 ” & cmd.Parameters(“pcount”).Value)
End Sub
—————————————————————————————-
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
Dim psql As String = “select rownum rn,t.* from cd_ssxl t”
gridbind(0, psql, 20)
End If
End Sub
—————————————————————————————
Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
Dim psql As String = “select rownum rn,t.* from cd_ssxl t”
Me.DataGrid1.CurrentPageIndex = e.NewPageIndex
gridbind(e.NewPageIndex, psql, 20)
End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1043228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 05:27:16
下一篇 2025年12月2日 05:27:47

相关推荐

  • Python学生成绩管理系统:优化数据结构与成绩更新策略

    本文将深入探讨如何使用python构建一个高效的学生成绩管理系统。针对原始设计中元组不可变性带来的课程成绩更新难题,我们将通过优化数据结构,将学生课程信息从列表嵌套元组改为嵌套字典。文章详细介绍了学生添加、课程添加(包括成绩更新逻辑:高分覆盖低分,零分忽略)以及学生成绩打印功能的实现,并提供了完整的…

    2025年12月14日
    000
  • Django 定时删除过期数据:使用 Celery 实现

    本文档旨在指导开发者如何在 Django 项目中实现自动删除过期数据的功能。通过集成 Celery 异步任务队列,我们可以创建一个定时任务,定期检查并删除数据库中创建时间超过指定期限(例如 15 天)的数据,从而保持数据库的整洁和性能。本文将提供详细的步骤和示例代码,帮助你快速上手。 在 Djang…

    2025年12月14日
    000
  • Django 数据库中自动删除过期数据:定时任务实现指南

    本文旨在指导开发者如何在 Django 项目中实现自动删除数据库中创建时间超过15天的数据。我们将探讨如何利用 Celery 等异步任务队列工具,设置定时任务来定期清理过期数据,并提供示例代码和注意事项,确保数据清理的可靠性和效率。 在 Django 项目中,自动删除数据库中创建时间超过一定期限(例…

    2025年12月14日
    000
  • 使用 NumPy 数组坐标列表高效更新矩阵

    本文旨在解决如何使用 NumPy 坐标列表高效更新矩阵的问题。我们将深入探讨 NumPy 数组的索引机制,解释为什么直接使用坐标元组列表进行索引会产生意想不到的结果,并提供使用高级索引和结构化数组两种方法来正确实现矩阵更新的方案,同时强调 NumPy 向量化操作的优势。 NumPy 提供了强大的数组…

    2025年12月14日
    000
  • 解决 Docker 构建 Wagtail 项目时 libsass 编译失败的问题

    本文旨在帮助开发者解决在使用 Docker 构建 Wagtail 项目时,遇到的 `Could not build wheels for libsass` 错误。通过分析错误原因,并提供更换基础镜像的解决方案,帮助读者顺利完成项目构建。 在使用 Docker 构建 Wagtail 项目时,可能会遇到…

    2025年12月14日
    000
  • Django表单联动:实现字段自动填充的客户端方案

    本文详细介绍了如何在Django Web应用中,利用客户端JavaScript/jQuery实现表单字段的实时联动自动填充。通过监听一个字段(如账户类型)的变化,根据预设的映射规则自动更新另一个字段(如最低开户金额)的值,从而提升用户体验,简化数据输入流程,并强调了客户端与服务器端协同验证的重要性。…

    2025年12月14日
    000
  • 如何临时抑制 structlog 日志输出

    在测试或特定代码块中,为避免因故意触发的错误而产生大量不必要的日志输出,可以使用 `structlog.testing.capture_logs` 上下文管理器。本文将详细介绍如何通过封装此管理器,创建一个语义更清晰的 `suppress_logging` 上下文管理器,从而实现对 `structl…

    2025年12月14日
    000
  • Telegram Bot 启动时定制化操作与信息获取指南

    本文深入探讨了在 `python-telegram-bot` v20 中,如何在 bot 启动时执行定制化操作和获取信息。重点介绍了 `applicationbuilder` 的 `post_init_handler` 回调函数,展示了如何在其中安全地进行 telegram api 调用,并明确指出…

    2025年12月14日
    000
  • 优化ChromaDB检索:提升PDF文档问答完整性

    本文旨在解决基于chromadb和langchain进行pdf文档问答时,响应内容不完整的问题。通过深入探讨文档切分策略(`chunk_size`和`chunk_overlap`)以及检索器配置(`k`参数),并结合langchain的`retrievalqa`链,提供一套优化方案,确保从多份pdf…

    2025年12月14日
    000
  • python操作xml的两种方法

    Python处理XML主要用xml.etree.ElementTree和lxml;前者是标准库,轻量简单但功能基础,适合基本操作;后者功能强大,支持XPath、XSLT等高级特性,性能更好但需安装;解析、遍历、查找、修改操作类似,ElementTree适用于简单场景,lxml适合复杂需求。 Pyth…

    2025年12月14日
    000
  • python中怎么给列表排序_Python列表排序方法详解

    Python列表排序中,sort()和sorted()的主要区别在于:前者原地修改列表并返回None,后者返回新列表而不改变原列表。两者均支持reverse参数控制升降序,以及key参数实现自定义排序逻辑,如按长度、字典值或忽略大小写等。例如,words.sort(key=len)按字符串长度升序排…

    2025年12月14日
    000
  • python传递实参的方法

    Python传递实参主要有六种方式:1. 位置参数按顺序传递,要求实参与形参顺序一致;2. 关键字参数通过“参数名=值”传参,提升可读性;3. 默认参数在定义时赋初值,调用可省略;4. args接收任意数量位置参数,存储为元组;5. kwargs接收任意数量关键字参数,存储为字典;6. 混合使用时需…

    2025年12月14日
    000
  • GDB远程调试大型Core Dump:挑战、原理与GDBserver方案

    本文深入探讨了在不传输大型core dump文件的情况下,使用gdb进行远程调试的挑战。重点分析了直接通过地址映射获取符号信息的局限性,并阐明gdb进行符号解析所需的完整上下文。文章指出,尽管直接映射不可行,但gdbserver提供了一种有效的远程调试解决方案,允许开发人员在本地加载符号信息,并通过…

    2025年12月14日
    000
  • 优化BeautifulSoup选择器:避免网络爬虫返回空数据

    本教程旨在解决使用beautifulsoup进行网页抓取时遇到的常见“空列表”问题。核心在于指导用户如何通过精确的css选择器定位目标数据,避免因选择器不当导致`find()`或`find_all()`返回`none`。文章将详细解析错误原因,并提供一个优化的解决方案,通过遍历文章容器来稳定提取新闻…

    2025年12月14日
    000
  • Pandas DataFrame:基于相对范围的值进行聚合

    本文介绍了如何使用 Pandas DataFrame,基于指定列的相对范围,对数据进行分组聚合。通过 groupby() 和 transform() 函数,结合 lambda 表达式,实现对每个分组内,值在特定范围内的行进行求和,最终生成目标聚合结果。 在数据分析中,经常会遇到需要根据数据的相对范围…

    2025年12月14日
    000
  • 使用 CircuitPython 控制三星电视的红外发射教程

    本文旨在指导开发者如何使用 CircuitPython 和 Adafruit IR Remote 库来控制三星电视。通过分析 IRLib2 库中的三星红外协议,我们将学习如何配置 `GenericTransmit` 类,并发送自定义红外信号,最终实现通过 Circuit Playground Exp…

    2025年12月14日
    000
  • python scrapy处理翻页的方法

    答案:处理Scrapy翻页需根据分页机制选择方法。1. 用response.follow提取“下一页”链接递归爬取;2. 构造规则URL批量请求;3. 利用meta传递分类等上下文信息;4. 针对Ajax动态加载,分析API接口直接请求JSON数据。 在使用Python的Scrapy框架爬取数据时,…

    2025年12月14日
    000
  • 如何加载HistWords项目中的预训练.npy词向量

    本教程旨在解决在使用stanford nlp histwords项目预训练`.npy`词向量时遇到的`modulenotfounderror`问题。核心在于遵循项目特定的设置流程,包括克隆仓库、配置python 2.7环境、安装依赖以及正确放置词向量文件,确保`examples.py`脚本能够顺利运…

    2025年12月14日
    000
  • 将Pandas与面向对象编程结合:复杂数据管理的教程指南

    本教程探讨了在数据分析中结合Pandas与面向对象编程(OOP)的策略,旨在解决传统函数式编程在处理复杂数据结构时遇到的维护挑战。文章将指导如何通过封装Pandas DataFrame于自定义类中,实现数据与操作的紧密结合,提升代码的可维护性、灵活性和可读性,同时利用OOP的优势进行数据验证、适应变…

    2025年12月14日
    000
  • 如何正确配置HistWords项目并加载预训练词向量

    本教程详细指导用户如何解决HistWords项目中的`ModuleNotFoundError`,并成功加载`.npy`格式的预训练词向量。文章涵盖了从环境准备(强调Python 2.7)、项目克隆、依赖安装到词向量下载与放置的完整设置流程,确保`example.py`脚本能顺利运行并处理词向量数据,…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信