它首先去查了一个sessionid,这个感觉和我们的意图无关。
几乎每次执行语句之前都会执行这一句
alter session set current_schema= xxx
结合此语句的意义,不难发现它的目的。这句的作用可以理解为相当于mysql数据库中的切换数据库,oracle叫做切换当前模式(直译,大部分中文资料也是这个翻译,亦或译为架构),主要是提供了对架构(模式)内的对象一种简便的访问方式,不指定架构(模式)时,默认从当前架构(模式)内查找。例如,执行alter session set current_schema= xxx,然后执行select* from user,此时的user表默认从xxx架构下寻找。
官网文档的叙述
但是以上语句并没有出现软件界面中显示的内容,这和不足以支撑我们的推断,但是如果结合接下来这句select username , case when (username=user) then 1 else 0 end iscurrentuser from sys.all_users;
查看此语句的返回结果
这段语句很多但是细看可以知道navicat首先去查了SYS.ALL_USERS。当我们选定其中某一项的内容查看下方的叙述,navicat将它看做一个“数据库”。可以得出一个结论:在oracle中一个用户就是一个“数据库”(这里的数据库跟前文提到的代表文件的数据库不同),一个“库”就是某一个用户架构(模式)下所有表的集合。
所以,打开navicat看到的那竖排以用户名命名的“数据库”既不是表空间也不是数据库,而是以用户名为命名的用户所拥有的表的集合的列表,这也就是schema的具体表现,我们看出,运行状态中的(也就是实例)oracle主要用Schema进行数据的分离,因为Schema和表空间都有一个很重要的特性,就是对表的独占性。默认情况下,Schema 同用户名称相同。Schema 是表的逻辑集合,是所有应用访问表必须指定的对象(不指定的话就是默认的schema)。