在做報表統計和bi分析時,需要從業務系統資料取數,在從saas系統和類似用友u8產品資料來源中取數時,
由於其資料庫的儲存結構比較特殊,分兩種情況:
1.saas產品:每個使用者的資料儲存在獨立的資料庫當中,多個資料庫的結構相同。有一張綜合管理表管理各使用者對應的資料來源資訊。
2.u8:每年為乙個賬套,每個賬套為乙個獨立的資料庫,資料庫結構相同。有一張使用者表維護使用者資訊。
如果使用oracle或者sql server作為資料庫,則直接可以通過類似:
sqlserver:[資料庫名].[模式].[表名或者檢視名]
或者oracle:[使用者名稱].[表名]的方式實現。
而如果使用mysql作為資料庫,由於mysql動態sql支援的侷限性,無法直接使用以上方式實現,則需要進行特殊處理,需要使用prepare+execute對動態sql進行預處理,來實現動態資料來源的查詢。
例如,有乙個saas產品,有乙個綜合使用者管理表,儲存在dbuser資料庫;兩個業務庫:bi和bi2.分別儲存aaa和ccc的兩個客戶的業務資料。均有test表。
現在需要實現,當使用者aaa登入時,檢視的是aaa的資料;使用者ccc登入時,檢視的是ccc的資料。
dbuser庫的user表:id,使用者名稱 name,資料庫名 dbinfo
sql偽**:select * from (select dbname from dbuser where name='aaa').test
1.在資料庫建立儲存過程,用於實現根據不使用者查詢不同的資料來源;
/*建立儲存過程,設定入參 para_user,用於接收使用者資訊引數*/create procedure proc_dynamic(in para_user nvarchar(20))
begin
declare stmt nvarchar(200);
declare sqlstr nvarchar(200);
declare dbname nvarchar(20);
/*獲取該使用者的資料來源名稱*/
select dbinfo into dbname from user where name = para_user;
set sqlstr=concat("select * from ",dbname,".test");
set @sql=sqlstr;
/*prepare預處理*/
prepare stmt from @sql;
execute stmt;
/*釋放預處理*/
deallocate prepare stmt;
end;
2.使用user表所在的dbuser資料庫建立資料來源。
3.建立報表,在報表中建立內嵌資料集。
3.1 執行儲存過程:
call proc_dynamic('aaa')
給定固定值呼叫儲存過程,用於獲取結果集的資料結構。
3.2 將呼叫語句改為動態sql。
="call proc_dynamic('" & usercontext.getvalue("name") & "')"
其中:usercontext.getvalue("name")為wyn reports內建函式,用於獲取當前登入使用者的使用者賬號。
3.3 設計報表
3.4 測試
分別使用aaa和ccc賬號的使用者登入系統,即可發現,不同使用者登入進來檢視到的是自己對應的資料庫的資料。
動態資料來源 mysql
前言 最近開發時遇到這樣乙個場景 在一段定時任務中需要將a資料庫中查詢的結果處理後,然後插入b資料庫,這是就考慮到用動態資料來源,在這裡記錄一下配置過程,僅供參考 一 在spring.xml新增配置 二 新增相應的工具類 public inte ce datasourceentry 資料來源切換實現...
spring 動態資料來源
spring 可以設定動態資料來源,這樣可以對程式來透明的支援切換操作不同的資料庫。這篇文章寫得非常不錯。測試通過,並準備在專案中使用這個方法。還有幾個問題希望大家給點意見 首先說一下我的需求 資料庫結構都是一樣,但具體有多少個資料庫不確定 視具體使用者而定 使用者操作那個資料庫要根據登入的時候進行...
birt 動態資料來源
有兩種方法 1.date set編輯器中有property binging的屬性,的query text輸入 var query select d.u.name from deal d,user u server s where s.id u.server id and u.id d.user id...