思路:先从另一个数据库里把数据取出来,

然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建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 跨数据库取数据的更多相关文章

  1. ORACLE跨数据库查询的方法

    原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...

  2. C#程序中从数据库取数据时需注意数据类型之间的对应,int16\int32\int64

    private void btn2_Click(object sender, RoutedEventArgs e)         {             using (SqlConnection ...

  3. Sqlserver 2005 跨数据库 导入数据

    --Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...

  4. php 跨数据库调取数据

    我的这个是thinkphp,我就在 Application -> Common -> Conf -> config.php 文件里面配置数据库的地方,加入了下面这段代码 //'数据库 ...

  5. oracle跨数据库跨用户訪问注意事项

    java代码中不同意出现oracle的username.数据链路名. 跨用户.跨数据库的訪问必须在oracle中建同义词或视图来实现.在java代码中仅仅需当做当前用户下的对象处理.

  6. python从数据库取数据后写入excel 使用pandas.ExcelWriter设置单元格格式

    用python从数据库中取到数据后,写入excel中做成自动报表,ExcelWrite默认的格式一般来说都比较丑,但workbook提供可以设置自定义格式,简单记录个demo,供初次使用者参考. 一. ...

  7. 从redis数据库取数据存放到本地mysql数据库

    redis数据库属于非关系型数据库,数据存放在内存堆栈中,效率比较高. 其存储数据是以json格式字符串存储字典的,而类似的关系型数据库无法实现这种数据的存储. 在爬取数据时,将数据暂存到redis中 ...

  8. jquery ajax跨域取数据

    jsonp.js/html 主要是利用jquery ajax和jsonp的datatype 跨站点请求数据,记录~ 同源策略:同端口,同协议,同域:所以ajax不能支持跨域取得数据,解决方案一般是js ...

  9. Oracle 跨库查询表数据(不同的数据库间建立连接)

      1.情景展示 当需要从A库去访问B库中的数据时,就需要将这两个库连接起来: 两个数据库如何实现互联互通,在oracle中,可以通过建立DBLINK实现. 2.解决方案 2018/12/05 第一步 ...

随机推荐

  1. Happy Number - LeetCode

    examination questions Write an algorithm to determine if a number is "happy". A happy numb ...

  2. C语言面试题(一)

       裸辞后,本周开始求职之旅.令人厌烦的是,大多数公司都会通知你去面试,然后拿出一纸试题,开始作答,最后笔试成绩作为重要的参考来决定是否录取你.对于大学四年挂了三年科的我,习惯遇到问题令辟溪径,从不 ...

  3. zookeeper第二课 客户端的简单命令

    zookeeper的每个节点既可以是目录也可以是文件,节点上只存一些协调数据(状态.配置.位置),单位一般是KB,大部分数据用sdfs上 只有持久化的节点才可以有子节点,临时节点不可以有自子节点. 客 ...

  4. 手机测试pc端网页

    在这个问题上徘徊了 一个钟头了,终于被我找到方法了,就赶紧记下来,以后好查阅!! 主要问题在防火墙,防火墙阻当了80端口,所以怎么用手机访问都是访问不了的.把防火墙关闭就好了! 贴上httpd-vho ...

  5. RMAN的恢复篇

    Oracle 数据库的恢复实际上包含了两个概念:数据库修复(RESTORE)与数据库恢复(RECOVER): 数据库修复:是指利用备份的数据库文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置. ...

  6. build.xml配置编译打包过程(转)

    工程目录如下,使用eclipse中的ant对此工程进行编译打包: MonServer | --------src |            |--------com |            |--- ...

  7. t检验

    例子:以往通过大规模调查已知某地新生儿出生体重为3.30kg.从该地难产儿中随机抽取35名新生儿作为研究样本,平均出生体重为3.42kg,标准差为0.40kg. 问该地难产儿出生体重是否与一般新生儿体 ...

  8. CSS实现垂直居中

    Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中的确是有vertical-align属性,但是它只对(X)HTML元素中拥有valign特性的元素才生效,例如表格元素中的<td>. ...

  9. JS历史

    JavaScript伴随着互联网的发展一起发展.互联网周边技术的快速发展,刺激和推动了JavaScript语言的发展. 2006年,jQuery函数库诞生,作者为John Resig.jQuery为操 ...

  10. css学习笔记 1

    对于一个页面,如何控制页面的结构就看如何去理解css的各个属性了,只有了解了css的各个属性后才能更有效的让css控制页面的任何一个结构. css的结构:选择符:{属性名1:属性值; 属性名2:属性值 ...