oracle 跨数据库取数据
思路:先从另一个数据库里把数据取出来,
然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建oralce临时表的方法及数据的插入。紧接着就可以写sql语句进行联合查询了。
下面是具体实例的方法:
//获取两个数据库的联合查询
public DataSet Pacs_depts()
{
//oracle 帮助类
OracleHelper sqlHelper = new OracleHelper();
//oracle帮助类的数据库连接字符串
sqlHelper.connectionString = Utility.DB.PubConstant.hisConstr;
DataSet ds = new DataSet();
strSql = new StringBuilder();
parameters = new List<DbParameter>();
strSql.Append(
@"
SELECT depts.DEPT_ID DEPT_ID, depts.HOSPITAL_ID, depts.DEPT_CODE,
depts.DEPT_NAME, depts.DEPT_ALIAS, depts.PARENT_DEPT_ID, depts.ACCOUNT_DEPT_ID,
depts.INPUT_CODE, depts.INPUT_ALIAS_CODE, depts.FULL_CODE,
depts.FULL_ALIAS_CODE, depts.FLAG_INVALID, depts.START_TIME, depts.STOP_TIME,
depts.DEPT_CLASS_ID, depts.ORDER_NO, depts.FLAG_REGISTER
FROM zyCOMM.DEPTS depts "); DataSet Pacs_depts1 = new DataSet();
Pacs_depts1 = sqlHelper.Query(strSql.ToString());//从另一个数据库里获取数据集合
strSql.Clear();
parameters.Clear();
//创建oracle临时表的生成及往临时表里插入数据。
strSql.Append(CreateOraTmpSql(Pacs_depts1, "TMP_Pacs_depts") + "\r\n");
// 所需要的联合查询的sql语句
strSql.Append(@"OPEN :refcursor FOR 'SELECT studydeptid.STUDYDEPT_ID, studydeptid.MODALITY_VALUE, studydeptid.MODALITY_DESCRIP, depts.DEPT_ID, depts.HOSPITAL_ID, depts.DEPT_CODE,
depts.DEPT_NAME, depts.DEPT_ALIAS, depts.PARENT_DEPT_ID, depts.ACCOUNT_DEPT_ID, depts.INPUT_CODE, depts.INPUT_ALIAS_CODE, depts.FULL_CODE,
depts.FULL_ALIAS_CODE, depts.FLAG_INVALID, depts.START_TIME, depts.STOP_TIME, depts.DEPT_CLASS_ID, depts.ORDER_NO, depts.FLAG_REGISTER
FROM DIC_STUDYDEPTID studydeptid LEFT OUTER JOIN
TMP_Pacs_depts depts ON studydeptid.STUDYDEPT_ID = depts.DEPT_ID';");
strSql.Append("\r\n END;");
var p1 = new OracleParameter(":refcursor", OracleDbType.RefCursor);
p1.Direction = ParameterDirection.Output;
parameters.Add(p1); DataSet Pacs_dept = new DataSet();
OracleHelper helper = new OracleHelper();
ds = helper.QuerySql(strSql.ToString(), parameters); return ds; }
/// <summary>
/// 返回根据数据集创建oracle临时表的SQL语句
/// </summary>
/// <param name="his"></param>
/// <returns></returns>
public string CreateOraTmpSql(DataSet his, string tmpName)
{
string sql = "declare v_cnt Number; ";
sql += " BEGIN ";
sql += " select count(*) into v_cnt from user_tables where table_name = '" + tmpName.ToUpper() + "'; ";
sql += " if v_cnt=0 then ";
sql += "execute immediate 'CREATE GLOBAL TEMPORARY TABLE " + tmpName.ToUpper() + "(";
var columns = his.Tables[].Columns;
foreach (DataColumn c in columns)
{
sql += c.ColumnName + " " + DBTypeChange(c.DataType.Name) + ",";
}
sql = sql.TrimEnd(new char[] { ',' });
sql += ") ON COMMIT DELETE ROWS ';\r\n";
sql += " end if;"; DataRowCollection rows = his.Tables[].Rows;
foreach (DataRow r in rows)
{
sql += "execute immediate 'insert into " + tmpName.ToUpper() + " values(";
sql += GetRowValueSql(r, true);
sql += ")';\r\n";
} return sql;
}
//创建第二张oracle临时表及插入数据语句
public string CreateOraTmpSql1(DataSet his, string tmpName)
{
string sql = "";
//sql += " BEGIN ";
sql += " select count(*) into v_cnt from user_tables where table_name = '" + tmpName.ToUpper() + "'; ";
sql += " if v_cnt=0 then ";
sql += "execute immediate 'CREATE GLOBAL TEMPORARY TABLE " + tmpName.ToUpper() + "(";
var columns = his.Tables[].Columns;
foreach (DataColumn c in columns)
{
sql += c.ColumnName + " " + DBTypeChange(c.DataType.Name) + ",";
}
sql = sql.TrimEnd(new char[] { ',' });
sql += ") ON COMMIT DELETE ROWS ';\r\n";
sql += " end if;"; DataRowCollection rows = his.Tables[].Rows;
foreach (DataRow r in rows)
{
sql += "execute immediate 'insert into " + tmpName.ToUpper() + " values(";
sql += GetRowValueSql(r, true);
sql += ")';\r\n";
} return sql; }
private string GetRowValueSql(DataRow row, bool doubleQuote = false)
{
string result = "";
var columns = row.Table.Columns;
foreach (DataColumn c in columns)
{
switch (c.DataType.Name.ToLower())
{
case "boolean":
if (doubleQuote)
{
result += (row[c].ToString() == "False" ? "''0''" : "''1''") + ",";
}
else
{
result += (row[c].ToString() == "False" ? "'0'" : "'1'") + ",";
}
break;
case "string":
if (doubleQuote)
{
result += "''" + row[c].ToString() + "''" + ",";
}
else
{
result += "'" + row[c].ToString() + "'" + ",";
}
break;
case "int32":
result += row[c].ToString() + ",";
break;
case "decimal":
result += row[c].ToString() + ",";
break; default:
if (doubleQuote)
{
result += "''" + row[c].ToString() + "'',";
}
else
{
result += "'" + row[c].ToString() + "',";
}
break;
}
}
result = result.TrimEnd(new char[] { ',' });
return result;
}
private string DBTypeChange(string str)
{
string outstr = "";
switch (str.ToLower())
{
case "boolean":
outstr = "CHAR(1)";
break;
case "string":
outstr = "VARCHAR2(500)";
break;
case "int32":
outstr = "NUMBER(10)";
break;
case "decimal":
outstr = "NUMBER(18)";
break; default:
outstr = "VARCHAR2(500)";
break;
} return outstr;
}
oracle 跨数据库取数据的更多相关文章
- ORACLE跨数据库查询的方法
原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...
- C#程序中从数据库取数据时需注意数据类型之间的对应,int16\int32\int64
private void btn2_Click(object sender, RoutedEventArgs e) { using (SqlConnection ...
- Sqlserver 2005 跨数据库 导入数据
--Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...
- php 跨数据库调取数据
我的这个是thinkphp,我就在 Application -> Common -> Conf -> config.php 文件里面配置数据库的地方,加入了下面这段代码 //'数据库 ...
- oracle跨数据库跨用户訪问注意事项
java代码中不同意出现oracle的username.数据链路名. 跨用户.跨数据库的訪问必须在oracle中建同义词或视图来实现.在java代码中仅仅需当做当前用户下的对象处理.
- python从数据库取数据后写入excel 使用pandas.ExcelWriter设置单元格格式
用python从数据库中取到数据后,写入excel中做成自动报表,ExcelWrite默认的格式一般来说都比较丑,但workbook提供可以设置自定义格式,简单记录个demo,供初次使用者参考. 一. ...
- 从redis数据库取数据存放到本地mysql数据库
redis数据库属于非关系型数据库,数据存放在内存堆栈中,效率比较高. 其存储数据是以json格式字符串存储字典的,而类似的关系型数据库无法实现这种数据的存储. 在爬取数据时,将数据暂存到redis中 ...
- jquery ajax跨域取数据
jsonp.js/html 主要是利用jquery ajax和jsonp的datatype 跨站点请求数据,记录~ 同源策略:同端口,同协议,同域:所以ajax不能支持跨域取得数据,解决方案一般是js ...
- Oracle 跨库查询表数据(不同的数据库间建立连接)
1.情景展示 当需要从A库去访问B库中的数据时,就需要将这两个库连接起来: 两个数据库如何实现互联互通,在oracle中,可以通过建立DBLINK实现. 2.解决方案 2018/12/05 第一步 ...
随机推荐
- [转](一)unity4.6Ugui中文教程文档-------概要
转载请注明出处:http://blog.csdn.net/u010019717更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/forum.php?mod=guid ...
- Struts2拦截器初涉
Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...
- kd tree学习笔记 (最近邻域查询)
https://zhuanlan.zhihu.com/p/22557068 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 KD树 ...
- 解决JSP路径问题的方法(jsp文件开头path, basePath作用)
原文:http://blog.csdn.net/mingxunzh/article/details/4627185 在JSP中的如果使用 "相对路径" 则有可能会出现问题. 因为 ...
- phalcon: update修改数据却变成了insert插入数据
phalcon: 在对表进行操作是,update修改数据却变成了insert插入数据. 发现,update的时,无论怎么加where都会变成了insert插入数据. 检查了一下表,原来是表没有 主键引 ...
- Caché数据库学习笔记(2)
目录: 创建新类(表)(class文件)与创建routine(.mac .inc) 在类里面添加函数(classmethod) Terminal的使用 ======================= ...
- Django1.9开发博客(6)- 模板继承
模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一 ...
- JavaWeb基础: XML基础知识
简介 XML:可扩展标记语言,W3C指定的用于描述结构化数据的语言,XML在实际开发中,经常用作软件的配置文件,以描述程序模块之间的依赖和组合关系. XML约束:XML常常用于软件配置管理,对于软件框 ...
- 转-浅谈HTTP中Get与Post的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- guava学习--hashing
128位的MurmurHash(烽火使用过): 看一下Java标准库中的非加密哈希算法你会发现少了MurmurHash,这是一个简单高效且还是分布式的算法,在许多语言中都有着很好的支持.我们并不是说要 ...