我是Oracle新手,我有两个表空间,一个用于开发,一个用于实时。
是否有一种方法可以在包含表空间名称的Package头上有一个变量,然后可以在包头中定义的过程中使用它?
我需要这样做,因为我有一个tableSpace(TableSpaceA)需要通过程序查询TableSpaceB中的表。 Dev TableSpaceB有一个不同的表空间名称,因此我希望我可以在Package头中声明一个像
这样的变量
Tablespace temp = "TableSpaceName"
然后
Select * from temp.TableName
当我将更改滚动到实时环境时,最后更改“TableSpaceName”?
答案 0 :(得分:4)
表空间是一种管理方式:它们是一种逻辑分组存储的方式,无需担心文件路径或其他管理员。
根据您修改后的问题,显然Tony是对的,您的意思是架构。
架构是用户拥有的对象集。当用户A拥有的过程需要引用模式B拥有的对象时,有两种方法可以执行此操作。第一种方法是对模式名称进行硬编码。
select *
from user_b.emp;
这通常很好,但在您描述的场景中不起作用,其他架构在其他环境中具有不同的名称(C而不是B)。
解决这个问题的方法是使用同义词。
select *
from not_my_emp;
在DEV中,同义词将是:
create synonym not_my_emp for user_b.emp
/
而在生产中它将是
create synonym not_my_emp for user_c.emp
/
该表甚至可以在生产中使用不同的表,这没关系。同义词充当接口,以保护我们的对象免受其他模式的不整洁细节的影响。
请注意,同义词不会授予基础对象的权限。这意味着USER_B必须在开发中授予EMP权限,USER_C必须在Production中授予权限。