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

然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建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. ES6(五) 数组扩展

    Array.of方法用于将一组值,转换为数组.  Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES ...

  2. C# 面试知识点总结

    1,事件是对象,委托时类型.事件内部其实就是一个private 的委托和add,remove两个方法. 2.override 和overload的区别: override是对基类中方法的重写,是会覆盖 ...

  3. Asp.Net Razor中的Consistent Layout

    有意义的参考:http://www.asp.net/web-pages/tutorials/working-with-pages/3-creating-a-consistent-look Asp.ne ...

  4. 触摸屏测试:Tslib

    触摸屏测试:Tslib(配置了一天,心累) 总结:网上有许多关于tslib的步骤/错误总结,所以这里只是提几个我觉得比较棘手的问题: 1,我明明给arm-linux-gcc配置了环境变量,为什么还是提 ...

  5. 在node.js中使用mongose模块

    对象与文档相对应 创建项目目录,用root进入 # mkdir /home/test/part9/ 直接# npm install mongoose,报错如下 ../node_modules/nan/ ...

  6. .net WebApi中使用swagger

    我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...

  7. 安装Python图型处理库Python Imaging Library(PIL)

    方法1: 在Debian/Ubuntu Linux下直接通过apt安装: $sudo apt-get install python-imaging Mac和其他版本的Linux可以直接使用easy_i ...

  8. Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法[转]

    方法一: 试试修改一下manifest文件 :添加 一句:   android:installLocation="preferExternal" [html]view plainc ...

  9. Python CSV模块处理文件读写

    下面是一个简单的csv文件 Title,Release Date,Director And Now For Something Completely Different,1971,Ian MacNau ...

  10. JavaScript对象 + Browser 对象 + HTML DOM 对象

    JavaScript 对象 Array Boolean Date Math Number String RegExp Global Browser 对象 Window Navigator Screen ...