oracle 存储过程返回 结果集 table形式 (使用sys_refcursor 及程序包package 两种方式)

1.创建一个表Test用来测试.

1 CREATE TABLE  "TEST" 
2    (    "AAA" NUMBER(*,0), 
3     "BBB" VARCHAR2(10 BYTE)
4    )

2.向Test表中插入测试数据

复制代码

1 insert into Test values(1,'a');
2 insert into Test values(2,'b');
3 insert into Test values(3,'c');
4 insert into Test values(1,'aaaa');
5 insert into Test values(2,'bbbbb');
6 insert into Test values(3,'cccccc');

复制代码

3.进入主题,创建存储过程 

1

2

3

4

5

6

7

8

create or replace procedure pro1(

  param nvarchar2,

  mycur OUT sys_refcursor --游标,用于存储过程中返回结果集

)

as

begin

       open mycur for select from test where AAA=param ;

end;

4.执行存储过程

1 var type_cur refcursor
2 var para nvarchar2(20)
3 execute :para :='1';
4 exec pro1(:para,:type_cur);
5 print type_cur;

5.使用程序包package创建存储过程 返回table

1 create or replace package pkg_HelloWorld as
2   type myrctype is ref cursor; --定义游标类型
3   procedure getHelloWorld (param nvarchar2,rst out myrctype); --创建存储过程声明,注:必须与程序包体中的存储过程头相同
4 end pkg_HelloWorld;

6.创建package body包体

复制代码

create or replace package body pkg_HelloWorld as
  procedure getHelloWorld(param nvarchar2,rst out myrctype) --注:必须与包声明中相同
as
begin
 open rst for
    select * from test where AAA=param;  
  end getHelloWorld;
end pkg_HelloWorld;

复制代码

7.调用 使用包,返回table

var type_cur refcursor
var para nvarchar2(20)
execute :para :='1';
exec PKG_HELLOWORLD.getHelloWorld(:para,:type_cur);
print type_cur;

 =========================================================================

来自:http://blog.itpub.net/12639172/viewspace-564910/

Asp.Net 访问Oracle的简单例子

 1.为灵活设置,将连接字符写在web.config文件中

 

  <appSettings>
        <add key="oracleconn" value="User ID=terryfeng;Password=frt_2007;Data Source=test;"/>  
<add key="oracleconn" value="User ID=terryfeng;Password=frt_2007;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST=192.168.1.200)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=test.finemoon)))" />
    appSettings>

字串说明:

   需要定义Net服务:  <add key="参数名" value="User ID=用户名;Password=用户密码;Data Source=数据源;"/>  注意:这种连接方法可能会出现权限问题请参考 我的另一篇随笔解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)

    无需定义Net服务:  <add key="参数名" value="User ID=用户名;Password=用户密码;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = 协议)(HOST=主机)(PORT=端口)))(CONNECT_DATA=(SERVICE_NAME=服务名)))" /> 注意: 这种方法有一个问题是,无法想上面的服务那样一次定义服务,在服务下面再定义多个连接

 2.为Web 应用程序 添加 System.Data.OracleClient 程序集引用 

 3.下面是测试的程序

  aspx 文件代码如下:

复制代码

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspNetOra._Default" %>
 2 
 3 <DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5 <head runat="server">
 6     <title>title>
 7 </head>
 8 <body>
 9     <form. id="form2" runat="server">
10     <div>
11         <p>
12             调用一个Oracle连接并执行一条语句测试是否成功<asp:Label ID="Label1" runat="server" ForeColor="Red" Text="">asp:Label>
13             <br />
14             <asp:Button ID="Button2" runat="server" OnClick="Button1_Click" Text="测试连接是否成功" />
15         </p>
16         <p>
17             调用给SQL语句执行绑定<br />
18             <asp:GridView ID="GridView2" runat="server">
19             asp:GridView>
20             <br />
21             <asp:Button ID="Button3" runat="server" OnClick="Button2_Click" Text="返回数据集合,绑定Gridview" />
22         </p>
23         <p>
24             输入输出参数的存储过程调用<br />
25             <asp:TextBox ID="TextBox1" runat="server">asp:TextBox>
26             <br />
27             <asp:Button ID="Button4" runat="server" Text="z输入输出参数的存储过程" OnClick="Button3_Click" />
28         </p>
29         <p>
30             执行返回数据集的Oracle存储过程<br />
31             <asp:GridView ID="GridView3" runat="server">
32             asp:GridView>
33             <asp:Button ID="Button5" runat="server" Text="执行存储过程返回数据集" OnClick="Button4_Click" />
34        </ p>
35    < /div>
36     <form>
37 <body>
38 <html>

复制代码

aspx.cs 文件代码如下:

1

复制代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using System.Data.SqlClient;
  8 using System.Data.OracleClient;
  9 
 10 namespace AspNetOra
 11 {
 12     public partial class _Default : System.Web.UI.Page
 13     {
 14         System.Data.OracleClient.OracleConnection objConn;  //声明一个OracleConnection对象
 15 
 16         System.Data.OracleClient.OracleCommand objCmd;  //声明一个OracleCommand对象
 17 
 18         string strcon = System.Configuration.ConfigurationManager.AppSettings["oracleconn"]; //从Web.config 文件里调用数据库连接字符串
 19 
 20         protected void Page_Load(object sender, EventArgs e)
 21         {
 22 
 23         }
 24         /// 
 25 
 26         /// 测试连接
 27         /// 
 28 
 29         /// 
 30         /// 
 31         protected void Button1_Click(object sender, EventArgs e)
 32         {
 33             try
 34             {
 35                 bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象
 36 
 37                 objConn.Open();  //打开数据库连接
 38 
 39                 string strSQL = "select * from sys.test1"; //查询sys建立的test1表的内容 因为我现在用的登录用户不是sys了
 40 
 41                 objCmd = new OracleCommand(strSQL, objConn); //用命令和连接对象建立命令实例
 42 
 43                 objCmd.ExecuteNonQuery();
 44 
 45                 objConn.Close();
 46 
 47                 this.Label1.Text = "成功";
 48 
 49             }
 50             catch
 51             {
 52                 this.Label1.Text = "失败";
 53             }
 54 
 55 
 56         }
 57 
 58         /// 
 59 
 60         /// 执行SQL 语句返回数据集合
 61         /// 
 62 
 63         /// 
 64         /// 
 65         protected void Button2_Click(object sender, EventArgs e)
 66         {
 67             bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象
 68 
 69             objConn.Open();  //打开数据库连接
 70 
 71             System.Data.OracleClient.OracleDataAdapter adapter = new OracleDataAdapter("select * from sys.test1", objConn);
 72 
 73             System.Data.DataSet ds = new System.Data.DataSet();
 74 
 75             adapter.Fill(ds);
 76 
 77             GridView1.DataSource = ds.Tables[0].DefaultView;
 78 
 79             GridView1.DataBind();
 80 
 81         }
 82 
 83         /// 
 84 
 85         ///  存储过程输入、输出参数
 86         ///  
 87         ///  存储过程定义如下:
 88         /// 
 89         ///  create or replace procedure getName(name_out out varchar2 ,id_in in varchar2) is
 90         ///  begin
 91         ///    select NAME into name_out from test1 where id = id_in;
 92         ///  end getName;
 93         /// 
 94         /// 
 95 
 96         /// 
 97         /// 
 98         protected void Button3_Click(object sender, EventArgs e)
 99         {
100             bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象
101 
102             objConn.Open();  //打开数据库连接
103 
104             OracleCommand cmd = new OracleCommand("getName", objConn);
105 
106             cmd.CommandType = System.Data.CommandType.StoredProcedure;
107 
108             cmd.Parameters.Add("name_out", OracleType.VarChar, 20); //输出参数,注意名字要与存储过程一致
109 
110             cmd.Parameters["name_out"].Direction = System.Data.ParameterDirection.Output;
111 
112             cmd.Parameters.Add("id_in", OracleType.VarChar, 20);  //输入参数,注意名字要与存储过程一致
113 
114             cmd.Parameters["id_in"].Direction = System.Data.ParameterDirection.Input;
115 
116             cmd.Parameters["id_in"].Value = "1";  //给输入参数赋值
117 
118             cmd.ExecuteNonQuery();
119 
120             this.TextBox1.Text = cmd.Parameters["name_out"].Value.ToString(); //获得输出参数
121 
122 
123         }
124 
125         /// 
126 
127         ///  Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages可以包含多个存储过程,
128         ///  访问存储过程时采用“包名.存储过程名”的方式。
129         ///  存储过程是我上一个随笔写的Test,但是上一个存储过程是用Sys建立的,在这里我又重新用当前用户建立的一个属于这个用户的包
130         ///  
131         ///  包定义如下:
132         ///  包头:
133         ///  create or replace package test is
134 
135         ///     TYPE MYCURSOR IS REF CURSOR;
136         ///     PROCEDURE GETLIST(cur_OUT OUT MYCURSOR);
137 
138         ///  end test;
139         /// 
140         /// 
141         /// 
142         ///   包体:
143         ///  create or replace package body test is
144 
145         ///    PROCEDURE GETLIST(cur_OUT OUT MYCURSOR) AS
146         ///    BEGIN
147         ///         OPEN cur_OUT FOR SELECT * FROM test1;
148         ///    END;
149 
150         ///  end test; 
151         /// 
152         /// 
153         /// 
154         /// 
155         /// 
156         /// 
157 
158         /// 
159         /// 
160         protected void Button4_Click(object sender, EventArgs e)
161         {
162             bjConn = new OracleConnection(strcon); //用连接字符串,实例化连接对象
163 
164             objConn.Open();  //打开数据库连接
165 
166             OracleCommand cmd = new OracleCommand("test.GETLIST", objConn);
167 
168             cmd.Parameters.Add("cur_OUT", OracleType.Cursor);     //注意这里的类型
169 
170             cmd.Parameters["cur_OUT"].Direction = System.Data.ParameterDirection.Output;
171 
172             cmd.CommandType = System.Data.CommandType.StoredProcedure;
173 
174             OracleDataAdapter da = new OracleDataAdapter(cmd);
175 
176             System.Data.DataSet ds = new System.Data.DataSet();
177 
178             da.Fill(ds);
179 
180             GridView2.DataSource = ds.Tables[0].DefaultView;
181 
182             GridView2.DataBind();
183 
184 
185         }
186     }
187 }

复制代码

========================================================================

这句话很重要,是使用oralce存储过程绑定gridview的关键->
  Oracle存储过程并不直接返回记录集,记录集以游标的形式通过参数返回。一个包(Packages可以包含多个存储过程,访问存储过程时采用“包名.存储过程名”的方式。
  也可以使用我刚才上面介绍的那种方式,直接使用存储过程返回sys_cursor。
直接使用存储过程sys_cursor与使用Package返回sys_cursor的使用方法完全一样,唯一不同的是调用时的语法略有差异。下面用C#代码写出来,可以与上面的做一下对比。

复制代码

 using (OracleConnection oraConn = new OracleConnection(DbFactory.GetConnStr(DataBase.Oracle, "192.168.0.1", "test", "1", "1")))
        {
            using (OracleCommand cmd = new OracleCommand("testProc2", oraConn))//只有这里有一点点区别
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add("cur_out", OracleDbType.RefCursor);
                cmd.Parameters["cur_out"].Direction = System.Data.ParameterDirection.Output;
                using (OracleDataAdapter oraDa = new OracleDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    oraDa.Fill(ds);
                    GridView1.DataSource = ds.Tables[0];
                    GridView1.DataBind();
                }
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arthas协助MQ消费性能优化

背景 项目中使用AWS的SQS消息队列进行异步处理&#xff0c;QA通过压测发现单机TPS在23左右&#xff0c;目标性能在500TPS&#xff0c;所以需要对消费逻辑进行优化&#xff0c;提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈&#xff…

AD21 PCB设计的高级应用(九)3D PDF的输出

&#xff08;九&#xff09;3D PDF的输出 1.3D PDF的输出2.制作PCB 3D视频 1.3D PDF的输出 Altium Designer 19 带有 3D输出功能,能够直接将 PCB 的 3D效果输出到 PDF 中。 ’(1)打开带有 3D 模型的 PCB 文件,执行菜单栏中“文件”→“导出”→“PDF3D”命令&#xff0c;选择…

“我,在腾讯月薪5万,离职后才明白:人越努力,只会越平庸”

那天看瑞达利欧说&#xff0c;他今年已经60岁了&#xff0c;可以说是阅人无数&#xff0c;但没有一个成功人士天赋异禀。 真的如他所说吗&#xff1f; 那张一鸣呢&#xff1f; 字节做到这么大&#xff0c;赚了这么多钱&#xff0c;不靠天赋&#xff0c;靠的是什么&#xff1…

PoseFormer:基于视频的2D-to-3D单人姿态估计

3D Human Pose Estimation with Spatial and Temporal Transformers论文解析 摘要1. 简介2. Related Works2.1 2D-to-3D Lifting HPE2.2 GNNs in 3D HPE2.3 Vision Transformers 3. Method3.1 Temporal Transformer Baseline3.2 PoseFormer: Spatial-Temporal TransformerSpati…

Grafana集成prometheus(2.Grafana安装)

查找镜像 docker search grafana下载指定版本 docker pull grafana/grafana:10.0.1启动容器脚本 docker run -d -p 3000:3000 --namegrafana grafana/grafana:10.0.1查看是否启动 docker ps防火墙开启 检查防火墙3000端口是否开启 默认用户及密码 admin/admin 登录 ht…

Python实现GA遗传算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

【0805作业】Linux中 AB终端通过两根有名管道进行通信聊天(半双工)(全双工)

作业一&#xff1a;打开两个终端&#xff0c;要求实现AB进程对话【两根管道】 打开两个终端&#xff0c;要求实现AB进程对话 A进程先发送一句话给B进程&#xff0c;B进程接收后打印B进程再回复一句话给A进程&#xff0c;A进程接收后打印重复1.2步骤&#xff0c;当收到quit后&am…

【Docker】DockerFile

目录 一、镜像原理 二、如何制作镜像 1、容器转镜像 2、DockerFile 三、DockerFile关键字​编辑 四、案例&#xff1a;部署SpringBoot项目 一、镜像原理 docker镜像是由一个特殊的文件系统叠加而成的&#xff0c;他的最低端是bootfs&#xff0c;并使用宿主机的bootfs&…

FPGA优质开源项目 – PCIE通信

本文介绍一个FPGA开源项目&#xff1a;PCIE通信。该工程围绕Vivado软件中提供的PCIE通信IP核XDMA IP建立。Xilinx提供了XDMA的开源驱动程序&#xff0c;可在Windows系统或者Linux系统下使用&#xff0c;因此采用XDMA IP进行PCIE通信是比较简单直接的。 本文主要介绍一下XDMA I…

继承(Inheritance)

Odoo的一个强大方面是它的模块化。模块专用于业务需求&#xff0c;但模块也可以相互交互。这对于扩展现有模块的功能非常有用。例如&#xff0c;在我们的房地产场景中&#xff0c;我们希望在常规用户视图中直接显示销售人员的财产列表。 在介绍特定的Odoo模块继承之前&#xf…

卸载本机已安装的node.js(v.16.13.0版本)

因为要用多版本的node&#xff0c;准备安装一个nvm管理&#xff0c;所以需要先卸载掉原来安装的v.16.13.0版本。 记录一下卸载过程 1、在系统设置-应用里卸载node 妈蛋这样卸载报错。。找了下根本没有这个路径 那就只能最简单的方法了&#xff0c;全部删掉 1、删除node的安装…

pygame贪吃蛇游戏

pygame贪吃蛇游戏 贪吃蛇游戏通过enter键启动&#xff0c;贪吃蛇通过WSAD进行上下左右移动&#xff0c;每次在游戏区域中随机生成一个食物&#xff0c;每次吃完食物后&#xff0c;蛇变长并且获得积分&#xff1b;按空格键暂停。 贪吃蛇 import random, sys, time, pygame from …

[CKA]考试之PersistentVolumeClaims

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 创建一个名字为pv-volume的pvc&#xff0c;指定storageClass为csi-hostpath-…

大模型使用——超算上部署LLAMA-2-70B-Chat

大模型使用——超算上部署LLAMA-2-70B-Chat 前言 1、本机为Inspiron 5005&#xff0c;为64位&#xff0c;所用操作系统为Windos 10。超算的操作系统为基于Centos的linux&#xff0c;GPU配置为A100&#xff0c;所使用开发环境为Anaconda。 2、本教程主要实现了在超算上部署LLAM…

MySQL — InnoDB事务

文章目录 事务定义事务特性事务隔离级别READ UNCOMMITTEDREPEATABLE READREAD COMMITTEDSERIALIZABLE 事务存在的问题脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non-repeatable Read&#xff09;幻读&#xff08;Phantom Read&#xff09; 事务定义 数据库…

零代码爬虫平台SpiderFlow的安装

什么是 Spider Flow &#xff1f; Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫。该工具支持多数据源、自动保存至数据库、任务监控、抓取 JS 动态渲染页面、插件扩展&#xff08;OCR 识别、邮…

Windows下安装Scala(以Scala 2.11.12为例)

Windows下安装Scala&#xff08;以Scala 2.11.12为例&#xff09; 一、Scala2.11.12官网下载二、Scala2.11.12网盘下载三、Scala各版本下载地址四、Scala安装4.1、点击 scala-2.11.12.msi 文件安装4.2、设置环境变量 %SCALA_HOME%4.3、环境变量Path添加条目%SCALA_HOME%\bin 四…

【云原生】使用kubeadm搭建K8S

目录 一、Kubeadm搭建K8S1.1环境准备1.2所有节点安装docker1.3所有节点安装kubeadm&#xff0c;kubelet和kubectl1.4部署K8S集群1.5所有节点部署网络插件flannel 二、部署 Dashboard 一、Kubeadm搭建K8S 1.1环境准备 服务器IP配置master&#xff08;2C/4G&#xff0c;cpu核心…

Vue系列第八篇:echarts绘制柱状图和折线图

本篇将使用echarts框架进行柱状图和折线图绘制。 目录 1.绘制效果 2.安装echarts 3.前端代码 4.后端代码 1.绘制效果 2.安装echarts // 安装echarts版本4 npm i -D echarts4 3.前端代码 src/api/api.js //业务服务调用接口封装import service from ../service.js //npm …

Jenkins触发器时间、次数设定

触发器触发条件介绍 触发器触发条件公式&#xff1a;由5颗星组成 * * * * * 分别代表&#xff1a;分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6) 企业项目中常用场景介绍 场景1&#xff1a;接口脚本部分测试通过&#xff0c;部分还在进行&#xff0c;回归测试脚本执行…