Oracle Query with Schema in main table

smtd7mpg  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(74)

我找到了很多类似的文章,但没有一个完全涵盖了我所需要的。我没有设计table,也不能修改它。我仅限于只读角色。
我在根架构中有一个信息表。我们称之为SchemaRoot。在信息表中,它包含一个字段,其中包含每条记录的附加模式。
Info.RootSchema
| 架构名称|项目所有者| ProjectOwner |
| --|--| ------------ |
| 项目1|鲍勃| Bob |
| 项目2|拉里| Larry |
然后所有的项目信息都在它自己的Schema中。
ProjectInfo.Project1或ProjectInfo.Project2
| 项目详情2|项目详情3| ProjectDetail3 |
| --|--| ------------ |
| 废话|废话| Blah |
| 废话|废话| Blah |
我需要能够查询的RootSchema和SubSchema的在一个查询。
所以我需要一些东西。
| 项目详情1|项目详情2|项目详情3| ProjectDetail3 |
对于Info. RootSchema中的每个项目。

dgjrabp2

dgjrabp21#

不好意思,但我不确定我们在这里说的是Oracle。你到底把什么叫做“模式”?在Oracle数据库中,我们创建了一个 user,然后该用户创建了它的表、视图、过程等,因此user +它的所有对象代表了一个 schema。我想这就是你想说的。
有一个“主”模式(root),而每个项目都有自己的模式(project1project2等)。
如果任何用户希望访问其他用户拥有的数据-例如,在您的情况下,root用户将选择名为project1project2等的用户拥有的数据。- 则这些用户必须root授予某些权限。
因此,你会

connect project1/its_password
grant select on projectinfo to root;

connect project2/its_password
grant select on projectinfo to root;

字符串
然后,以root身份连接并访问其他用户拥有的数据,方法是在表名前面加上其所有者(例如,project1.projectinfo-而不是反之亦然,这是您张贴的内容-如果我没说错的话),或者通过创建同义词

create synonym project1_projectinfo for project1.projectinfo;
create synonym project2_projectinfo for project2.projectinfo;


对于示例数据:

SQL> select * from info;

SCHEMANA PROJE
-------- -----
Project1 Bob
Project2 Larry

SQL> select * From project1_projectinfo;

PROJECTD PROJECTD
-------- --------
1 info 1 1 info 2
1 info 3 1 info 4

SQL> select * from project2_projectinfo;

PROJECTD PROJECTD
-------- --------
2 info 6 2 info 7


你会得到

SQL> select r.projectowner, a.projectdetail1, a.projectdetail2
  2  from info r cross join project1_projectinfo a
  3  where r.schemaname = 'Project1'
  4  union all
  5  select r.projectowner, b.projectdetail1, b.projectdetail2
  6  from info r cross join project2_projectinfo b
  7  where r.schemaname = 'Project2';

PROJE PROJECTD PROJECTD
----- -------- --------
Bob   1 info 1 1 info 2
Bob   1 info 3 1 info 4
Larry 2 info 6 2 info 7

SQL>


这几乎是一个“硬编码”的解决方案。是否可以“动态”完成?是的;一个选项是创建一个函数,该函数组成select语句,用作引用游标的源。举例来说:

SQL> create or replace function f_test
  2    return sys_refcursor
  3  is
  4    l_str varchar2(10000);
  5    rc sys_refcursor;
  6  begin
  7    for cur_r in (select schemaname, projectowner from info) loop
  8      l_str := l_str ||
  9        'select ' || chr(39) || cur_r.projectowner || chr(39) || ' as projectowner, ' ||
 10        'projectdetail1, projectdetail2 from ' || cur_r.schemaname ||'_projectinfo' ||
 11        ' union all ';
 12    end loop;
 13    l_str := regexp_replace(l_str, ' union all $');
 14    open rc for l_str;
 15    return rc;
 16  end;
 17  /

Function created.


测试:

SQL> select f_test from dual;

F_TEST
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

PROJE PROJECTD PROJECTD
----- -------- --------
Bob   1 info 1 1 info 2
Bob   1 info 3 1 info 4
Larry 2 info 6 2 info 7

SQL>


如果不是这样的话,那我显然听不懂你在说Oracle。

相关问题