Orcale学习问题

这篇博客主要介绍了如何使用.NET访问Oracle数据库,包括命名空间System.Data.OracleClient和System.Data.OleDb的不同连接方式。此外,文章还详细对比了Oracle和SQL Server的数据类型,如number、nvarchar2、date等,并探讨了Oracle中存储过程和函数的调用方法。对于.NET开发者,文章还提供了C#调用Oracle存储过程的示例代码。最后,博主分享了一些Oracle的日期和字符串操作函数,如TO_DATE、TO_CHAR等。
摘要由CSDN通过智能技术生成
   1.     NET访问ORACLE数据库
   命名空间System.Data.OracleClient 
  System.Data.OracleClient中访问Oracle数据库的连接串是:
User ID=用户名; Password=密码; Data Source=服务名
 
System.Data.OleDb 中的访问 Oracle 数据库的连接串是:
Provider=MSDAORA.1; User ID=用户名; Password=密码; Data Source=服务名
2.     Oracle 中的数据类型
 Oracle 的数据类型和 SQL Server 相比,SQL Server 的大多数据类型很容易找到 .NET 中比较接近的类型,Oracle 中的类型就离 .NET 类型远了许多。
 
  number: 数字类型,一般是 Number(M,N),M是有效数字,N是小数点后的位数(默认0),这个是按十进制说的。 
nvarchar2: 可变长字符型(Unicode),这个比较像 SQL Server 的 nvarchar.
nchar: 定长字符型(Unicode)。 
nclob: "写作文"的字段,存储大量字符(Unicode)时用。 
date: 日期类型,比较接近 SQL Server 的 datetime。
Oracle 中字段不能是 bit 或者 bool 之类的类型,一般是 number(1) 代替的。
 
和 SQL Server 一样在 SQL 命令中,字符类型需要用单引号(')隔开,两个单引号('')是单引号的字符转义
比较特殊的是日期类型:比如要写入 2004-7-20 15:20:07 这个时刻需要如下写:

UPDATE ... SET ... = TIMESTAMP '2004-7-20 15:20:07' ...

注意这里使用了 TIMESTAMP 关键字,并使用单引号隔开;另外请注意日期格式,上面的格式是可识别的,Oracle 识别的格式没有 SQL Server 那般多。这是和 SQL Server 不同的地方。

3.访问 Oracle 过程/函数

SQL Server 作程序时经常使用存储过程,Oracle 里也可以使用过程,还可以使用函数。Oracle 的过程似乎是不能有返回值的,有返回值的就是函数了(SQL Server 存储过程是可以有返回值的)。

.NET 访问 Oracle 过程/函数的方法很类似于 SQL Server,例如:

OracleParameter[] parameters = {
    new OracleParameter("ReturnValue", OracleType.Int32, 0, ParameterDirection.ReturnValue, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull )
    new OracleParameter("参数1", OracleType.NVarChar, 10),
    new OracleParameter("参数2",  OracleType.DateTime),
    new OracleParameter("参数3",  OracleType.Number, 1)
 };

parameters[1].Value = "test";
parameters[2].Value = DateTime.Now;
parameters[3].Value = 1;                        // 也可以是 new OracleNumber(1);

OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("函数/过程名", connection);
command.CommandType = CommandType.StoredProcedure;

foreach(OracleParameter parameter in parameters)
     command.Parameters.Add( parameter );

connection.Open();
command.ExecuteNonQuery();
int returnValue = parameters[0].Value; //接收函数返回值
connection.Close();

Parameter 的 DbType 设定请参见 System.Data.OracleClient.OracleType 枚举的文档,比如:Oracle 数据库中 Number 类型的参数的值可以用 .NET decimal 或 System.Data.OracleClient.OracleNumber 类型指定; Integer 类型的参数的值可以用 .NET int 或 OracleNumber 类型指定。等等。

上面例子中已经看到函数返回值是用名为"ReturnValue"的参数指定的,该参数为 ParameterDirection.ReturnValue 的参数。

不返回记录集(没有 SELECT 输出)的过程/函数,调用起来和 SQL Server 较为类似。但如果想通过过程/函数返回记录集,在 Oracle 中就比较麻烦一些了。

在 SQL Server 中,如下的存储过程:

CREATE PROCEDURE GetCategoryBooks
(
    @CategoryID int
)
AS
SELECT * FROM Books
WHERE CategoryID = @CategoryID
GO

在 Oracle 中,请按以下步骤操作:

(1)创建一个包,含有一个游标类型:(一个数据库中只需作一次)

CREATE OR REPLACE PACKAGE Test
  AS
       TYPE Test_CURSOR IS REF CURSOR;
END Test;

(2)过程:

CREATE OR REPLACE PROCEDURE GetCategoryBooks
(
     p_CURSOR out Test.Test_CURSOR,    -- 这里是上面包中的类型,输出参数
     p_CatogoryID INTEGER
)
AS
BEGIN
     OPEN p_CURSOR FOR
           SELECT * FROM Books
           WHERE CategoryID=p_CatogoryID;
END GetCategoryBooks;

(3).NET 程序中:

OracleParameters parameters = {
     new OracleParameter("p_CURSOR", OracleType.CURSOR, 2000, ParameterDirection.Output, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull),
     new OracleParameter("p_CatogoryID", OracleType.Int32)
};

parameters[1].Value = 22;

OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("GetCategoryBooks", connection);
command.CommandType = CommandType.StoredProcedure;

foreach(OracleParameter parameter in parameters)
     command.Parameters.Add( parameter );

connection.Open();
OracleDataReader dr = command.ExecuteReader();

while(dr.Read())
{
    // 你的具体操作。这个就不需要我教吧?
}
connection.Close();

另外有一点需要指出的是,如果使用 DataReader 取得了一个记录集,那么在 DataReader 关闭之前,程序无法访问输出参数和返回值的数据。
 
4.C#调用oracle存储过程(例子)
Oracle方面
(1)创建Oracle过程存储
create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)
as
  varparam varchar2(28);
begin
  varparam:=paramin;
  paramout:=varparam|| paraminout;  
end;
(2)测试过程存储
declare
  param_out varchar2(28);
  param_inout varchar2(28);
begin
  param_inout:='ff';   
  proce_test('dd',param_out,param_inout);   
  dbms_output.put_line(param_out);
end;

C#方面
引用Oracle组件 
using System;
using System.Data;
using System.Data.OracleClient;    

namespace WebApplication4
{
     public class OraOprater
     {
         private OracleConnection conn=null;
         private OracleCommand cmd=null;
         public OraOprater()
         {
              string mConn="data source=ora9i.ora.com;user id=ora;password=ora";  //连接数据库
              conn=new OracleConnection(mConn);
              try
              {
                   conn.Open();
                   cmd=new OracleCommand();
                   cmd.Connection=conn;
              }
              catch(Exception e)
              {
                   throw e;
              }
         }

         public string SpExeFor(string m_A,string m_B)
         {
                //存储过程的参数声明
              OracleParameter[] parameters={
                                 new OracleParameter("paramin",OracleType.VarChar,20),
                                new OracleParameter("paramout",OracleType.VarChar,20),
                                 new OracleParameter("paraminout",OracleType.VarChar,20)
                                                };
              parameters[0].Value=m_A;
              parameters[2].Value=m_B;
              parameters[0].Direction=ParameterDirection.Input;
              parameters[1].Direction=ParameterDirection.Output;
              parameters[2].Direction=ParameterDirection.InputOutput;
              try
              {
                   RunProcedure("proce_test",parameters);
                  return parameters[1].Value.ToString();
              }
              catch(Exception e)
              {
                   throw e;
              }
         }

         private void RunProcedure(string storedProcName,OracleParameter[] parameters)
         {
              cmd.CommandText=storedProcName;//声明存储过程名
              cmd.CommandType=CommandType.StoredProcedure;
              foreach(OracleParameter parameter in parameters)
              {
                   cmd.Parameters.Add(parameter);
              }
              cmd.ExecuteNonQuery();//执行存储过程
         }
     }
}
测试结果:ddff
  
/***********************************************************************
 * Module:  OraHelper.cs http://csharp.xdowns.com
 * Author:  hellopj
 * Purpose: Definition of the Class OraHelper
 ***********************************************************************/

using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Collections;
using System.Configuration;
namespace OraHelper
{
 public abstract class OraHelper 
 {
   public static readonly string CONN_STRING_NON_DTC = ConfigurationSettings.AppSettings["ConnStr"].Trim();
  public static OracleConnection conn = new OracleConnection(CONN_STRING_NON_DTC);

  public static void OpenConnection()
  {
   if (conn.State != ConnectionState.Open)
    conn.Open();
  }
  public static void CloseConnection()
  {
   if (conn.State == ConnectionState.Open)
    conn.Close();
  }
  public static DataSet getDataSet(string cmdText) 
  {
   
   OracleDataAdapter Adapter = new OracleDataAdapter(cmdText,conn);
   DataSet Data = new DataSet();
   Adapter.Fill(Data);
   return Data;
  }
  public static OracleDataReader ExecuteReader(string cmdText) 
  {
   
   OracleCommand cmd = new OracleCommand();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值