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

然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建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() + "(";
            ].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() + "(";
            ].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. C#程序中从数据库取数据时需注意数据类型之间的对应,int16\int32\int64

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

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

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

  3. jquery ajax跨域取数据

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

  4. 【转】最简单的CI框架入门示例--数据库取数据

    1.下载CI框架(自己找) 2.配置 database.php配置:    为数据库服务器设置 connection 参数: $db['default']['hostname'] = "yo ...

  5. 针对数据量较大的表,需要进行跨库复制,采用navcat 实现sqlite数据库跨数据库的数据表迁移 [转载]

    2014年12月13日 14:36 新浪博客 (转自http://www.cnblogs.com/nmj1986/archive/2012/09/17/2688827.html) 需求: 有两个不同的 ...

  6. sql sever跨数据库复制数据的方法【转】

    1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...

  7. Jmeter—8 连接microsoft sql server数据库取数据

    本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...

  8. ecshop数据库取数据

    取出所有数据: test_getAll(); function test_getAll() { global $db; $sql = "SELECT user_id, user_name, ...

  9. SQL server 使用触发器跨数据库备份数据

    create database TriggerTest create table transInfo2 --交易信息表 ( cardID ) not null, --卡号 transType ) no ...

随机推荐

  1. java多线程系类:JUC线程池:05之线程池原理(四)(转)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  2. 在simplescalar中添加基于PISA架构的指令

    用sim-safe工具进行模拟.最近看代码的一点点心得记录一下. sim-safe工具:不检查所有指令错误,检查内存对齐和所有内存操作的内存访问权限 程序从main.c的main()函数中进入 int ...

  3. Python基本数据类型之dict

    一.创建字典: d = { "name": "morra", #字典是无序的 "age": 99, "gender": ...

  4. XPath的基本使用

    XPath XPath 使用路径表达式来选取 XML 文档中的节点或节点集. 路径表达式 结果 bookstore 选取 bookstore 元素的所有子节点. /bookstore 选取根元素 bo ...

  5. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  6. [GO编程]GO编程环境

    GO是一个开源项目,由Google大神发明的,他主要是用于应用程序级开放,可以编译成机器码,和C++一样不需要.NET或JAVA那样的运行框架,因此是个不错的编程语言.更何况发明者都是高手中的高手,而 ...

  7. Transact-SQL 示例 - UPDATE中使用INNER JOIN

    一般情况下博主已经对在SELECT语句当中使用INNER JOIN非常娴熟,但在UPDATE当中使用INNER JOIN的场景就为数不多了.以下博主将为你介绍在UPDATE场景当中使用INNER JO ...

  8. iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#

    更新时间2014年11月13日  本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...

  9. DCDC(4.5V to 23V -3.3V)

    这里的电感应该用体积10*12的

  10. BackgroundWorker组件

    BackgroundWorker组件封装了后台线程的操作,并且直接利用线程池,无需自己管理线程池等复杂问题. 它主要适用于 比如界面后台加载数据,进度显示,上传下载文件,日月结等 这些都是繁重的劳动, ...