我们在 Oracle 11g 服务器中有大量数据。大多数工程师使用 Tableau 来可视化数据,但由于数据库的结构,目前还没有一个很好的解决方案可以直接从 Oracle 服务器进行可视化。不幸的是,这无法更改,因为它与我们的其他系统非常紧密地集成在一起。有一个“字典”表,我们称之为tab_keys
:
name | key
---------------
AB-7 | 19756
BG-0 | 76519
FY-10 | 79513
JB-2 | 18765
...
...
还有实际包含数据的表。中的每个条目tab_keys
都有一个相应的数据表,通过在键前面加上标识符来命名,在这种情况下,我们将使用“dat_”。因此 AB-7 会将其所有数据存储在一个名为dat_19756
. 这些密钥不为用户所知,仅用于“幕后”跟踪。用户只知道 AB-7 的绰号。
Tableau 允许使用标准 SQL 选择语句与 Oracle 服务器进行通信,但由于用户不知道键值,他们无法编写 SQL 语句来查询数据。
Tableau 最近增加了用户查询 Oracle 表函数的能力,所以我开始写一个表函数来查询键,并返回一个结果表供 Tableau 使用。问题是每个 dat_ 表基本上是唯一的,具有不同数量的列、标签、记录数和下一个 dat_ 表的数据类型。
处理这个问题的正确方法是什么?我可以吗:
1)编写一个函数(哪个tableau可以在常规SQL中调用内联)来返回一个动态生成的bonified表名?我试过这个:
create or replace FUNCTION TEST_FUNC
(
V_NAME IN VARCHAR2
) RETURN user_tables.table_name%type AS
V_KEY VARCHAR(100);
V_TABLE user_tables.table_name%type;
BEGIN
select KEY into V_KEY from my_schema.tab_keys where NAME = V_NAME;
V_TABLE := dbms_assert.sql_object_name('my_schema.dat_' || V_KEY);
RETURN V_TABLE;
END TEST_FUNC;
然后SELECT * from TABLE(TEST_FUNC('AB-7'));
但我得到:
ORA-22905: cannot access rows from a non-nested table item
22905. 00000 - "cannot access rows from a non-nested table item"
*Cause: attempt to access rows of an item whose type is not known at
parse time or that is not of a nested table type
*Action: use CAST to cast the item to a nested table type
我想不出一种将表格转换为我需要的表格类型的好方法。这可以在返回之前在函数中完成吗?
2)写一个表函数?据说 Tableau 可以查询这些类似的表,但后来我遇到了动态生成类型的问题(我理解这并不容易),但是这增加了需要多个用户同时使用的复杂性,所以每个用户都需要一个每次连接到表时为他们生成的数据类型(如果我理解正确的话)。
我不得不认为我错过了一些简单的东西。如何将此查询的返回转换为其他表的数据类型?