ORCAL数据库是Oracle公司开发的一种用于管理和处理企业级应用程序数据的关系数据库管理系统。作为业内最常用、最可靠的数据库之一,ORCAL数据库极大地促进了企业技术的发展。ORCAL数据库强大而灵活的功能,为用户提供了其他数据库无法满足的数据管理解决方案。
数据库中的同义词是一个关键功能,大大提高了数据库的灵活性和用户的便利性。本文将探讨ORCAL数据库同义词的使用技巧,以帮助用户更好地利用数据库。
一、同义词的定义和用途
同义词在ORCAL数据库中指一组指向一个对象、在操作上与原对象具有相同效果的替代名称。同义词是一个虚拟对象,它们并不占用数据库中的实际存储空间。
同义词的主要用途是为了方便对数据库对象的访问,特别是当数据库中有多个模式时,同义词可以使得在不同模式中访问相同对象更加便捷、直观。同义词还可以改变数据库对象的名称,以便在程序发生变化时,不会破坏程序和表之间的连接。
二、同义词的创建和使用
在ORCAL数据库中,同义词可以通过以下方式创建:
CREATE [PUBLIC] SYNONYM synonym_name
FOR [schema.]object_name[@database_link];
CREATE语句中,PUBLIC关键字是可选的。如果在创建同义词时使用PUBLIC关键字,则该同义词可以在整个数据库中使用;否则该同义词只能在本用户或角色下使用。
schema是对象所在的模式名称,object_name是该对象的名称,database_link是数据库链名,如果该对象不在本地数据库中,则需要指定外部数据库名。
例如,创建一个同义词,用于访问用户hr下的表employees:
CREATE SYNONYM hr_emp
FOR hr.employees;
创建同义词后,可以通过以下方式访问原对象:
SELECT * FROM hr_emp;
如果hr模式名发生变化,只需要修改创建同义词的模式名,而不需要修改原程序和表的名称。
同义词除了可以用于访问表和视图外,还可以用于访问存储过程、函数等数据库对象。例如,创建同义词,用于执行存储过程:
CREATE SYNONYM sp_test
FOR hr.test_sp;
执行存储过程:
EXEC sp_test(param1, param2);
三、同义词的注意事项
在使用同义词时,需要注意以下几点:
1. 同义词只能访问有访问权限的对象,在使用同义词前,需要授权该用户或角色对该对象进行访问。
2. 同义词不能替代数据库内部对象的名称,例如,不能创建同义词以替代表或视图的名称,否则会导致数据访问失败。
3. 在使用同义词时,需要避免使用复杂的对象命名规则,以免产生命名冲突。
4. 创建同义词时,需要确保同义词和原对象名称大小写一致。
5. 如果多个用户需要访问同一个对象,可以创建同义词,并进行授权,而不是每个用户都访问原对象。
四、
ORCAL数据库的同义词是一项极其便利的功能,可以使得数据库的访问更加直观、灵活,同时也提高了数据库的安全性和可维护性。本文介绍了同义词的定义、用途、创建和使用技巧,并指出了使用同义词需要注意的事项。希望本文能够帮助ORCAL数据库使用者更好地掌握同义词的使用技巧,提高数据操作效率。
相关问题拓展阅读:
oracle数据库同义词导入错误,怎么重新导入
oracle导入的同义词其实就是一个创建语句而已,如果同义词很多的话,直接用PL/SQL Developer的菜单栏的工具=>导出对象里面选择需要洞轮厅导出的同义词 命名为imp_synonym.sql 导出路径比如设置位D盘根目录 D:\ imp_synonym.sql 完成纳隐后 打开cmd窗口 输入 D:
进入到D盘,然后sqlplus到目标数据库,然后输入 @imp_synonym.sql 或者直接写全路径
@D:\imp_synonym.sql直接执行这个脚本文件桐汪就导入同义词了。
oracle同义词查询不了。
SELECT * FROM SYS.ALL_SYNONYMS WHERE SYNONYM_NAME=’S’.里面有
同义词
的表与用户
同义词权限管理
与同义词相关的权限有CREATE SYNONYM、CREATE ANY SYNONYM、CREATE PUBLIC SYNONYM权限。
1:用户在自己的模式下创建私有同义词,这个用户必须拥有CREATE SYNONYM权限,否则不能创建私有同义词。
如下所示,用户DM缺少CREATE SYNONYM权限,创建同义词时会报ORA01031错误
SQL> CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON;
CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON
ORA01031: insufficient privileges
用sys账号给DM账号赋予CREATE SYNONYM的权限
SQL> GRANT CREATE SYNONYM TO DM;
Grant succeeded.
然后创建私有同义词
SQL> CREATE SYNONYM TEST FOR DM.TM_WGG_ATM_GTW_MON;
Synonym created
2:如果需要在其它模式下创建同义词,则必须具有CREATE ANY SYNONYM的权限。
看下面的例子
用户DM想创建SCOTT模式下的私有同义词
SQL> CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP;
CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP
ORA01031: insufficient privileges
用sys账号稿渣给DM账号赋予CREATE ANY SYNONYM的权限
SQL> GRANT CREATE ANY SYNONYM TO DM;
Grant succeeded.

SQL> CREATE SYNONYM SCOTT.EM FOR SOCTT.EMP;
Synonym created
3:创建公有同义词则需蠢卖要CREATE PUBLIC SYNONYM系统权限。
创建同义词
创建同义词的语法如下:
clip_image001
普通用法如下所示:
CREATE SYNONYM 同义词名称 FOR object ;
专有(私有)同义词
CREATE SYNONYM SYSN_TEST FOR TEST;
公共同义词
CREATE PUBLIC SYNONYM PUBLIC_TEST FOR TEST;
如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后再使用如下语句创建数据带敬逗库同义词:create synonym table_name for table_name@DB_Link;
公共同义词是和用户的schema无关的,但是公共的意思并不是所有的用户都可以访问它,必须被授权后才能进行;私有同义词是schema的对象
查看同义词
SQL> SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME IN ( ‘SYSN_TEST’,’PUBLIC_TEST’);
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK
PUBLIC PUBLIC_TESTETLTEST
ETLSYSN_TESTETLTEST
SQL> SELECT * FROM USER_SYNONYMS
使用同义词
SELECT * FROM SYSN_TEST;
使用同义词可以保证当数据库的位置或对象名称发生改变时,
应用程序
的代码保持稳定不变,仅需要改变同义词;
当使用一个没有指定schema的同义词是,首先在用户自己的schema中寻找,然后再公共同义词中寻找
删除同义词
DROP SYNONYM 同义词名称 ;
DROP SYNONYM SYSN_TEST;
DROP PUBLIC SYNONYM PUBLIC_TEST;当同义词的原对象被删除是,同义词并不会被删除
编译同义词
ALTER SYNONYM T COMPILE; 当同义词的原对象被重新建立时,同义词需要重新编译
对原对象进行DDL操作后,同义词的状态会变成INVALID;当再次引用这个同义词时,同义词会自动编译,状态会变成VALID,无需人工干预,当然前提是不改变原对象的名称
SQL> SELECT * FROM T;
SQL> SELECT * FROM TEST;
SQL> ALTER TABLE TEST ADD SEX NUMBER(1);
Table altered
SQL> SELECT OBJECT_NAME, STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME=’T’;
OBJECT_NAME STATUS
问题锦集
1:公用同义词与私有同义词能否同名呢?如果可以,访问同义词时,是共有同义词还是私有同义词优先?
可以,如果存在公用同义词和私有同义词同名的情况,在访问同义词是,访问的是私有同义词的指向的对象。
2:为啥OE用户创建的公用同义词,HR用户不能访问呢?
因为HR没有访问OE模式下对象的权限,如果OE模式给HR用户赋予了SELECT对象等权限,那么HR用户即可访问。
3:对象、私有同义词、公共同义词是否可以存在三者同名的情况?
在用户kerry下,创建表TEST
SQL>CREATE TABLE TEST
AS SELECT * FROM USER_OBJECTS WHERE 1= 0;
创建私有同义词TEST
SQL> CREATE SYNONYM TEST FOR REF.REF_WGG_STUDENT;
CREATE SYNONYM TEST FOR REF.REF_WGG_STUDENT
ORA00955: name is already used by an existing object
注意:对象(表)与私有同义词不能同名,否则会报ORA00955错误
创建公共同义词TEST,如下所示,公共同义词可以对象同名
SQL> CREATE PUBLIC SYNONYM TEST FOR REF.REF_WGG_STUDENT;
Synonym created
访问TEST时,如下所示:它是表TEST的内容,而不是公共同义词的内容
SQL> SELECT * FROM TEST;
OBJECT_NAME SUBOBJECT_NAME OBJECT_ID>香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
oracle存储过程
create table dept (deptno number, dname varchar2(20), loc varchar2(20) ) 1.如果你是取出单个的,你可以定义一个或者多个变量,将取出的值赋给变量 例如: create or replace procedure dept_procedure(a in varchar2) is v_no number; v_a varchar2(20); begin select , into v_no,v_a from dept a where =a; dbms__line(学号为:||v_no||); end; 2.如果你取出的是一个结果集,你可以用游标(一个简单的例子) create or replace procedure dept_procedure(a in varchar2,v_a out dept%rowtype) is --声明游标 cursor c_de(a in varchar2) is select * from dept where dname=a; begin --打开游标,对其中找到的记录进行遍历 open c_de(a); loop fetch c_de into v_a; exit when c_de%notfound; end loop; close c_de; dbms__line(deptno:||v_); dbms__line(dname:||v_); dbms__line(loc:||v_); end; 3.可注意:在创建存储过程的时候加上or replace,如果遇到重名的存储过程将替换掉! 4.定义变量后面记得加上分号 中可以对它直接赋值,可不用set, v_a:=a; (6.给变量赋值的时候注意它的数据类型 a要单引号) 7.如果你这存储过程是将参数赋值给一个你定义的变量的话,那这样你不觉得是多此一举么?一般将参数赋值给你定义的变量的话,可以进行数据类型转换!可在此存储过程中,没发现它的用处 8.你取出来的数据,要放在变量或是游标中,显示出来,不然你写出来的存储过程有什么用呢?所以 select ... 9.我也是刚学oracle的,希望可以互相学习一下,呵呵!上面的如有错误希望可以告诉我一下啊
oracle中把两个表的两个字段中内容相同的数据查询出来之后,再用表2里面的相同的内容替换掉表1相同的内容?
我看了上面的回答,以及推荐的回答,好像都不是您要求的满意方式介绍如下方式:需要创建一个临时中间表,然后再把替换的内容插回原表举例:create table temp_table as //这里创建临时表,第一次是新建,后面反复应用的话要么先drop临时表再新建,要么先删除再insertselectT1.A1,T2.A2 ASA2, //这里是把t2的信息去替换t1的内容,支持同时多条数据替换T2.A3 ASA3,//这里是把t2的信息去替换t1的内容,支持同时多条数据替换T1.A4FROMT1INNER JOINT2ON T1.A1 = T2.A2commit;//提交事件//这个时候临时表temp_table存储的是需要替换的数据;//再删除T1表中要被替换的老内容,再插入临时表中被替换的新内容deleteFROMT1 WEHRE T1.A1 IN (SELECT A1 FROMtemp_table);insertinto T1select* fromtemp_table;commit;//提交事件如果正确,还望采纳,并给予评价!谢谢!
Oracle函数 和 Oracle存储过程的区别
函数和存储过程的区别从参数的返回情况来看:如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数;从调用情况来看:如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程,但调用存储函数的时候还有好多限制以及函数的纯度等级的问题,你可以参考《ORACLE 9I PL\SQL程序设计》(机械工业出版社);如果是在过程化语句中调用的话,就要看你要实现什么样的功能。 函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等),所以虽然他们的语法上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。
发表评论