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

然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建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. Java开发中经典的小实例-(用*打印图案)

    public class Test19 {    public static void main(String[] args) {        // TODO Auto-generated meth ...

  2. Scrum Meeting 2-20151202

    任务安排 姓名 今日任务 明日任务 困难 董元财 完成下拉刷新的实现 请假(明天是编译截至最后一天) 无 胡亚坤 完成圆形头像代码设计 请假(明天是编译截至最后一天) 无 刘猛 学习listview的 ...

  3. JavaScript中的String

    1.基本类型String var str ="helloworld"; 要记住:保存的是Unicode字符,一旦创建便不可变   2.引用类型String var strObj = ...

  4. IAR更改代码字体&快速模板设置。——Arvin

    1.是用软件提供的字体 如果只想简单的设置,可进行如下设置Tools->IDE Options->Editor->Colors and Fonts->Editor Font-& ...

  5. 原!!mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集

    需求: 1.直接执行前端传来的任何sql语句,parameterType="String", 2.对于任何sql语句,其返回值类型无法用resultMap在xml文件里配置或者返回 ...

  6. Decorator

    1 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更灵活. 2 别名:包装器Wrapper 3 动机:将组件嵌入到另一个对象中,由这个对象添加边框.嵌入的 ...

  7. miniui设置边框的方法

    if (field == "loginname") { if (record._id == 2) { e.cellHtml = ""; e.cellStyle ...

  8. 向JS对象添加和删除事件

    this.removeEventListener = function (obj, ename, func) { var store = obj[this.addEventListener.pre + ...

  9. guava学习--hashing

    128位的MurmurHash(烽火使用过): 看一下Java标准库中的非加密哈希算法你会发现少了MurmurHash,这是一个简单高效且还是分布式的算法,在许多语言中都有着很好的支持.我们并不是说要 ...

  10. require.js基本认识

    基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...