Oracle数据库之 常用数据库对象(二)

目录

1.视图

1.1.什么是视图?

1.2.创建视图的语法

1.3.简单视图和复杂视图

1.4.创建复杂视图

1.4.1.创建复杂视图的步骤

1.4.2.示例

1.4.3.注意事项

1.5.视图中使用DML的规定

1.5.1.屏蔽DML操作

1.6.删除视图

2.序列

2.1.语法:

2.2.查询序列

2.3.修改序列

2.4.删除序列

3.索引

3.1.单列索引

3.2.复合索引

3.3.什么时候创建索引

3.4.什么时候不要创建索引

3.5.查询索引

3.6.删除索引

4.同义词

4.1.创建同义词

4.2.删除同义词


1.视图

1.1.什么是视图?

  • 视图是一个虚表.
  • 视图建立在已有表的基础上,视图赖以建立的这些表称为基表.
  • 向视图提供数据内容的语句为select语句,可以将视图理解为存储起来的select语句.
  • 视图向用户提供基表数据的另一种表现形式.
  • 最大的优点就是简化复杂的查询。

1.2.创建视图的语法

create [or replace] [force | noforce] view view_name [(alias_column_name [, alias_column_name] ...)]  
as  
select ... [from ...];  
[with check option [constraint constraint_name]]  
[with read only [constraint constraint_name]];
  • 其中:create [or replace]:如果视图已经存在,使用or replace选项将替换现有的视图定义。如果不存在,则仅使用create

  • [force | noforce]
    • force:即使基表不存在,也强制创建视图(但这样的视图将无法使用,直到基表被创建)。
    • noforce:这是默认选项,如果基表不存在,则不会创建视图。
  • view_name:新视图的名称。
  • (alias_column_name [, alias_column_name] ...):为视图中的列定义别名(可选)。
  • as select ... [from ...]:定义视图的查询语句。
  • [with check option [constraint constraint_name]]:此选项确保对视图进行的任何更改(如insert、update或delete)都满足视图的where子句条件(如果有的话)。constraint constraint_name是可选的,用于为约束指定一个名称。
  • [with read only [constraint constraint_name]]:此选项使视图成为只读视图,即不能通过视图进行insert、update或delete操作。constraint constraint_name是可选的,用于为约束指定一个名称。

语法1:

create view 视图名称 as 子查询

 假设我们有一个名为employees的表,并且我们想要创建一个只显示姓氏为"Smith"的员工的视图:

create view view_smith_employees as  
select employee_id, first_name, last_name  
from employees  
where last_name = 'smith';

语法2:

create or replace view 视图名称 as 子查询

 假设我们有一个名为employees的表,并且我们想要创建一个只显示姓氏为"Smith"的员工的视图

如果视图已经存在我们可以使用语法2来创建视图,这样已有的视图会被覆盖。

create or replace view view_smith_employees as  
select employee_id, first_name, last_name  
from employees  
where last_name = 'smith';

1.3.简单视图和复杂视图

不建议通过视图对表中数据进行修改,因为会受到很多的限制。

1.4.创建复杂视图

复杂视图通常指的是那些SQL语句中包含聚合函数(如SUM、AVG、COUNT等)、多表连接、子查询或层次化查询等复杂操作的视图。

1.4.1.创建复杂视图的步骤
  1. 确定需求:首先,你需要明确视图需要满足什么样的业务需求或查询需求。
  2. 编写SQL语句:根据需求编写复杂的SQL查询语句。这可能包括使用聚合函数、多表连接、子查询等。
  3. 创建视图:使用CREATE VIEW语句和编写的SQL查询语句来创建视图。
1.4.2.示例

示例1:多表连接和聚合函数

假设你有两个表:orders(订单表)和customers(客户表)。你想要创建一个视图,显示每个客户的订单总数和总金额。

create view view_customer_orders as  
select c.customer_id, c.customer_name, count(o.order_id) as total_orders, sum(o.order_amount) as total_amount  
from customers c  
join orders o on c.customer_id = o.customer_id  
group by c.customer_id, c.customer_name;

示例2:层次化查询(使用START WITH和CONNECT BY)

假设你有一个表示组织结构的表organization,其中包含emp_id(员工ID)、emp_name(员工姓名)和manager_id(经理ID)等字段。你想要创建一个视图,显示每个员工及其所有下属员工。

create view view_organization_hierarchy as  
select emp_id, emp_name, level as hierarchy_level  
from organization  
start with manager_id is null  
connect by prior emp_id = manager_id;
1.4.3.注意事项
  • 性能:复杂视图可能会导致查询性能下降,特别是在处理大量数据时。因此,在创建复杂视图之前,最好先对SQL语句进行性能优化。
  • 可维护性:复杂视图可能难以理解和维护。为了保持代码的可读性和可维护性,建议在创建视图时添加适当的注释,并遵循良好的编码规范。
  • 权限:与简单视图一样,你需要确保只有授权的用户才能访问和修改复杂视图。可以通过授予或撤销视图的权限来实现这一点。
  • 修改限制:对于包含聚合函数或多表连接的复杂视图,可能无法直接对其进行修改(如INSERT、UPDATE或DELETE)。在尝试对复杂视图进行修改之前,请确保了解相关的限制和约束。

1.5.视图中使用DML的规定

  • 可以在简单视图中执行DML操作
  • 当视图定义中包含以下元素之一时不饿能使用delete:
    • 组函数
    • GROUP BY 子句
    • DISTINCT 关键字
    • ROWNUM 伪列
  • 当视图定义中包含以下元素之一时不能使用update:
    • 组函数
    • GROUP BY 子句
    • DISTINCT 关键字
    • ROWNUM 伪列
    • 列的定义方式为表达式
  • 当视图定义中包含以下元素之一时不能使用insert:
    • 组函数
    • GROUP BY 子句
    • DISTINCT 关键字
    • ROWNUM 伪列
    • 列的定义方式为表达式
    • 列中非空的列在视图定义中未包括
1.5.1.屏蔽DML操作
  • 可以使用WITH READ ONLY 选项屏蔽对视图的DML操作
  • 任何DML操作都会返回一个Oracle server 错误

1.6.删除视图

删除视图只是删除视图的定义,并不会删除基本表的数据。

drop view view_smith_employees;drop view view_organization_hierarchy;

2.序列

在很多数据库中都存在一个自动增长的列,如果现在要想在oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。并且Oracle将序列值装入内存可以提高访问效率。

序列:可供多个用户用来产生唯一数值的数据库对象:

  • 自动提供唯一的数值
  • 共享对象
  • 主要用于提供主键值
  • 将序列值装入内存可以提高访问效率

2.1.语法:

create sequence 序列名  [increment by n]         -- 定义序列的步长,默认为1  [start with n]           -- 定义序列的初始值,默认为1  [{maxvalue n | nomaxvalue}]   -- 定义序列的最大值,nomaxvalue表示没有最大值限制  [{minvalue n | nominvalue}]   -- 定义序列的最小值,nominvalue表示没有最小值限制  [{cycle | nocycle}]      -- 定义当序列达到限制值后是否循环,默认为nocycle  [{cache n | nocache}];   -- 定义是否缓存序列值,默认为nocache

示例:

  1. 创建一个简单的序列,从1开始,每次递增1:

    create sequence seq_example;
  2. 创建一个从100开始,每次递增2的序列

    create sequence seq_example_start_inc  start with 100  increment by 2;
  3. 创建一个从1开始,每次递增1,最大值为1000的序列,当达到最大值时循环:

    create sequence seq_example_max_cycle  start with 1  increment by 1  maxvalue 1000  cycle;
  4. 创建一个使用缓存的序列(注意:使用缓存的序列在数据库异常关闭时可能会导致值的不连续):

    create sequence seq_example_cache  start with 1  increment by 1  cache 20;
    

注意事项

  • 当你使用cache选项时,Oracle会预先分配并缓存指定数量的序列值。如果数据库异常关闭,则可能会丢失尚未使用的缓存值。为了避免这种情况,你可以使用NOCACHE或定期重新启动序列(使用alter sequence ... restart)。
  • 当你定义maxvaluecycle时,序列在达到最大值后会从头开始(即minvalue)。同样,如果定义了minvalue和cycle,序列在达到最小值后会重新开始(即maxvalue)。
  • 你可以使用nextval和currval来从序列中获取值。NEXTVAL返回序列的下一个值,并将序列递增。currval返回序列的当前值(但在首次使用之前,必须先调用nextval)。

2.2.查询序列

  1. 查询当前用户下的所有序列名称

    SELECT sequence_name FROM user_sequences;
  2. 查询数据库中所有用户的所有序列名称

    SELECT sequence_name FROM all_sequences;
  3. 查询当前用户下某个序列的详细信息(包括名称、最小值、最大值、递增步长和当前值):

    SELECT sequence_name, min_value, max_value, increment_by, last_number   
    FROM user_sequences   
    WHERE sequence_name = '你的序列名';

    如果你想要查询所有序列的详细信息,可以省略WHERE子句。

  4. 查询指定序列的当前值

    注意:你不能直接通过查询user_sequencesall_sequences视图来获取序列的当前值。但是,你可以通过调用序列的CURRVAL(如果已经调用过NEXTVAL)或NEXTVAL(这会返回下一个值并递增序列)来获取。但请注意,CURRVAL不能在序列的第一次使用之前被调用。

    例如,如果你有一个名为seq_test的序列,并且你已经至少调用过一次seq_test.NEXTVAL,那么你可以这样查询当前值:

    SELECT seq_test.CURRVAL FROM dual;

    但如果你还没有调用过seq_test.NEXTVAL,那么上述查询将会失败。在这种情况下,你应该首先调用seq_test.NEXTVAL来获取并递增序列的值,然后再使用seq_test.CURRVAL

  5. 连接到Oracle数据库:要使用上述查询,你首先需要连接到Oracle数据库。你可以使用SQL*Plus、SQL Developer、PL/SQL Developer或其他支持Oracle的工具来连接。

  6. 编写和执行查询:在连接到数据库后,你可以编写并执行上述查询来获取序列的信息。

2.3.修改序列

修改序列可以使用ALTER SEQUENCE语句来修改序列的属性

  1. 修改序列的起始值(START WITH)

    如果你想修改序列的起始值,可以使用START WITH子句。例如,如果你有一个名为seq_test的序列,你想将其起始值设置为1000,你可以执行以下SQL语句:

    ALTER SEQUENCE seq_test START WITH 1000;
  2. 修改序列的递增值(INCREMENT BY)

    如果你想修改序列的递增值,可以使用INCREMENT BY子句。例如,如果你希望每次从序列中获取值时,它都递增5,你可以执行以下SQL语句:

    ALTER SEQUENCE seq_test INCREMENT BY 5;
  3. 修改序列的最大值(MAXVALUE)和最小值(MINVALUE)

    你还可以修改序列的最大值和最小值。但是请注意,一旦序列已经达到了其当前的最大值或最小值,并且你尝试再次从中获取值(除非指定了CYCLE),Oracle将会报错。以下是如何修改最大值和最小值的示例:

    ALTER SEQUENCE seq_test MAXVALUE 2000;  
    ALTER SEQUENCE seq_test MINVALUE 500;
  4. 设置序列是否循环(CYCLE/NOCYCLE)

    ALTER SEQUENCE seq_test CYCLE;

    或者,如果你想禁止循环并允许序列在达到其限制时报错,你可以使用NOCYCLE选项:

    ALTER SEQUENCE seq_test NOCYCLE;
  5. 修改序列的缓存设置(CACHE/NOCACHE)

    当使用CACHE选项时,Oracle会预先分配并缓存一组序列号。这可以提高获取序列号的性能,但如果在数据库异常关闭时丢失了尚未使用的缓存值,可能会导致序列中的“间隙”。你可以使用NOCACHE选项来禁用缓存。例如:

    ALTER SEQUENCE seq_test CACHE 20;  
    ALTER SEQUENCE seq_test NOCACHE;
  6. 注意事项

  • 在修改序列之前,请确保你了解这些更改可能如何影响依赖于该序列的应用程序或数据库对象。
  • 在生产环境中进行任何更改之前,最好在测试环境中验证这些更改。
  • 当你修改一个正在被多个用户或进程使用的序列时,需要特别小心,以确保这些更改不会导致任何问题或不一致性。
  • 必须时序列的拥有者或对序列有ALTER权限
  • 只有将来的序列值会被改变
  • 改变序列的初始值只能通过删除序列之后重建序列的方法实现

2.4.删除序列

在 Oracle 数据库中,你可以使用 DROP SEQUENCE 语句来删除一个已经存在的序列。在删除序列之前,请确保没有其他的数据库对象(如表、触发器、存储过程等)正在引用该序列,因为这将导致删除操作失败。

以下是 DROP SEQUENCE 语句的基本语法:

DROP SEQUENCE sequence_name;

其中 sequence_name 是你想要删除的序列的名称。

例如,如果你有一个名为 my_sequence 的序列,并且你想要删除它,你可以使用以下 SQL 语句:

DROP SEQUENCE my_sequence;

当你执行这个语句后,Oracle 将删除该序列,并且释放与该序列关联的所有资源。请注意,一旦序列被删除,所有与该序列关联的数据也将被永久删除,并且无法恢复。因此,在执行删除操作之前,请务必确保你已经备份了所有重要的数据。

另外,如果你只是想重置序列的当前值,而不是完全删除它,你可以使用 ALTER SEQUENCE 语句的 RESTART WITH 选项。例如,要将 my_sequence 的当前值重置为 1,你可以使用以下 SQL 语句:

ALTER SEQUENCE my_sequence RESTART WITH 1;

3.索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o的次数,从而提高数据访问性能。

  • 一种独立于表的模式对象,可以存储在与表不同的磁盘或表空间中
  • 索引被删除或损坏,不会对 表产生影响,其影响的只是查询的速度
  • 索引一旦建立,Oracle管理系统会对其进行自动维护,而且由Oracle管理系统决定何时使用索引,用户不用再查询语句中指定使用哪个索引
  • 再删除一个表时,所有基于该表的索引会自动被删除
  • 通过指针加速Oracle服务器的查询速度
  • 通过快读定位数据的方法,减少磁盘 I/O

3.1.单列索引

在Oracle数据库中,单列索引是一种索引类型,它基于表中的单个列创建。这种索引可以显著提高查询性能,特别是当查询条件基于该列时。

以下是关于Oracle单列索引的一些要点:

  1. 定义:单列索引是在表的单个列上创建的索引。它允许数据库系统更快地访问基于该列的数据。

  2. 创建:你可以使用CREATE INDEX语句来创建单列索引。例如,假设你有一个名为employees的表,并且你想要在last_name列上创建一个单列索引,那么你可以使用以下SQL语句:

    CREATE INDEX idx_last_name ON employees(last_name);

    在这个例子中,idx_last_name是索引的名称,employees是表名,而last_name是你要创建索引的列名。

  3. 用途:单列索引特别适用于在查询中使用单个列进行条件过滤、排序和连接操作的情况。当查询条件基于索引列时,数据库系统可以快速定位到相关数据,而无需扫描整个表。

  4. 性能:通过减少磁盘I/O次数和提高数据访问速度,单列索引可以显著提高查询性能。但是,它们也会占用额外的存储空间,并可能增加写操作的开销(如插入、更新和删除操作)。

  5. 注意事项:虽然单列索引可以提高查询性能,但过度使用它们可能会导致性能下降。在创建索引之前,你应该仔细评估你的查询需求和数据模式,以确定哪些列最适合创建索引。此外,定期审查和优化你的索引策略也是很重要的,以确保它们仍然满足你的性能需求。

  6. 其他索引类型:除了单列索引之外,Oracle还支持其他类型的索引,如组合索引(基于多个列)、唯一索引(确保列中的值是唯一的)、位图索引(用于处理低基数数据)等。你可以根据你的具体需求选择适当的索引类型。

3.2.复合索引

Oracle复合索引,也被称为联合索引或组合索引,是指在Oracle数据库中,同时基于两个或两个以上列创建的索引。它允许数据库系统更快地访问基于这些列组合的数据。

以下是关于Oracle复合索引的一些要点:

  1. 创建:你可以使用CREATE INDEX语句来创建复合索引。例如,假设你有一个名为employees的表,并且你想要在last_namefirst_name列上创建一个复合索引,那么你可以使用以下SQL语句:

    CREATE INDEX idx_name ON employees(last_name, first_name);

    在这个例子中,idx_name是索引的名称,employees是表名,而last_namefirst_name是你要创建索引的列名。

  2. 使用:当查询条件同时涉及到复合索引的多个列时,复合索引可以显著提高查询性能。但是,需要注意复合索引的最左前缀原则,即查询条件必须包含复合索引的最左侧列,否则复合索引可能不会被使用。

  3. 性能:虽然复合索引可以提高查询性能,但也可能增加写操作的开销(如插入、更新和删除操作),因为当这些操作涉及到复合索引的列时,索引也需要被相应地更新。

  4. 设计:在设计复合索引时,应该充分考虑各字段的筛选度和查询需求。通常,建议将选择性最高的字段(即具有更多唯一值的字段)放在复合索引的最左侧。

  5. 注意事项:过度使用复合索引可能会导致性能下降,因为每个复合索引都会占用额外的存储空间,并可能增加写操作的开销。因此,在创建复合索引之前,你应该仔细评估你的查询需求和数据模式,以确定哪些列组合最适合创建复合索引。

总之,Oracle复合索引是一种强大的工具,可以帮助你提高数据库查询性能。但是,在使用它时需要注意其特点和使用原则,以确保其能够发挥最佳效果。

3.3.什么时候创建索引

  • 列中数据值分布范围很广
  • 列经常在where子句或连接条件中出现
  • 表经常被访问而且数据量很大,访问的数据大概占数据总量的2%到4%

3.4.什么时候不要创建索引

  • 表很小
  • 列不经常作为连接条件或出现在where子句中
  • 查询的数据大于2%到4%
  • 表经常更新

3.5.查询索引

在 Oracle 数据库中,你可以使用多种方法来查询索引。以下是一些常用的查询索引的方法:

  1. 查询某个表的索引:使用 USER_INDEXESALL_INDEXES 或 DBA_INDEXES 视图,配合 USER_IND_COLUMNSALL_IND_COLUMNS 或 DBA_IND_COLUMNS 视图,可以查询某个表的索引信息。

    例如,查询用户拥有的某个表(比如 employees)的所有索引:

    SELECT idx.index_name, idx.table_name, idx.column_name, idx.column_position  
    FROM USER_IND_COLUMNS idx  
    JOIN USER_INDEXES i ON idx.index_name = i.index_name  
    WHERE idx.table_name = 'EMPLOYEES'  
    ORDER BY idx.index_name, idx.column_position;

    如果你有权限,也可以将 USER_ 替换为 ALL_ 或 DBA_ 来查询其他用户或整个数据库的索引。 

  2. 查询所有索引:如果你想要查询数据库中所有的索引,可以直接查询 DBA_INDEXES 视图(需要相应的权限):
    SELECT index_name, table_name, uniqueness  
    FROM DBA_INDEXES  
    ORDER BY table_name, index_name;

    这里的 uniqueness 列会显示索引是唯一的(UNIQUE)还是非唯一的(NONUNIQUE)。

  3. 查询索引的详细信息:你还可以查询 DBA_IND_COLUMNSDBA_IND_PARTITIONSDBA_IND_STATISTICS 等视图来获取关于索引的更详细信息,如索引的分区信息、统计信息等。
  4. 使用数据字典:除了上述的视图外,你还可以使用 Oracle 的数据字典来获取索引信息。例如,执行 DESCRIBE INDEX index_name;(其中 index_name 是你要查询的索引名)可以获取索引的列信息。但请注意,DESCRIBE 命令通常用于描述表或视图的结构,对于索引可能不如使用视图来得详细。
  5. 使用 SQL*Plus 或其他工具:你可以使用 SQL*Plus、SQL Developer、PL/SQL Developer 等工具来执行上述查询,并查看结果。这些工具通常提供了图形化的界面来查看和管理数据库对象,包括索引。

3.6.删除索引

  1. 确定要删除的索引名称
    首先,你需要知道你想要删除的索引的名称。你可以通过查询 USER_INDEXESALL_INDEXES 或 DBA_INDEXES 视图来获取这些信息。

  2. 使用 DROP INDEX 语句
    一旦你知道了索引的名称,你就可以使用 DROP INDEX 语句来删除它。

    示例:

    DROP INDEX index_name;

    其中 index_name 是你想要删除的索引的名称。

  3. 确保你有足够的权限
    删除索引需要相应的权限。如果你没有权限,你可能需要联系你的数据库管理员或者使用有足够权限的用户来执行这个操作。

  4. 考虑索引对性能的影响
    在删除索引之前,请确保你了解这个索引是如何被使用的,以及删除它可能会如何影响数据库的性能。索引可以提高查询性能,但也会占用存储空间并可能增加插入、更新和删除操作的开销。

  5. 注意依赖对象
    确保没有数据库对象(如视图、存储过程、触发器等)依赖于你要删除的索引。如果有依赖对象,你可能需要先修改或删除这些对象,然后再删除索引。

  6. 备份
    在删除任何数据库对象之前,始终建议进行备份。这可以在出现错误或意外情况时提供恢复选项。

示例:
假设你有一个名为 idx_employees_last_name 的索引,并且你想要删除它。你可以使用以下 SQL 语句来执行此操作:

DROP INDEX idx_employees_last_name;

执行此语句后,idx_employees_last_name 索引将被删除。

4.同义词

Oracle同义词是数据库对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在Oracle数据库中,同义词提供了一种在不同数据库用户之间实现无缝交互的方式,扩展了数据库的使用范围。

Oracle同义词有两种类型:

  1. 公用Oracle同义词:由一个特殊的用户组Public所拥有,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。
  2. 私有Oracle同义词:与公用同义词相对应,由创建它的用户所有。只有这个同义词的创建者,或者通过授权的用户,才有权使用属于自己的私有同义词。私有同义词名称不可与当前模式的对象名称相同。

4.1.创建同义词

同义词的创建语法如下:

CREATE [PUBLIC] SYNONYM synonym_name FOR object_name;

其中,[PUBLIC] 是可选的,用于指定是否创建公用同义词。synonym_name 是要创建的同义词的名称,object_name 是要为之创建同义词的数据库对象的名称。

例如,要为用户 john 创建一个名为 employees_syn 的私有同义词,该同义词引用 hr.employees 表,可以使用以下SQL语句:

CREATE SYNONYM employees_syn FOR hr.employees;

注意,执行此语句的用户需要具有创建同义词的权限,并且该用户需要能够访问 hr.employees 表。

要查询Oracle数据库中的同义词列表,可以使用以下SQL查询语句:

  • 查询当前用户及其访问权限范围内的所有同义词信息:SELECT * FROM ALL_SYNONYMS;
  • 查询当前用户自己创建的所有同义词信息:SELECT * FROM USER_SYNONYMS;
  • 查询所有同义词的详细信息(包括同义词所引用的对象及其所有者等信息):SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE='SYNONYM';

4.2.删除同义词

在Oracle数据库中,要删除同义词,你可以使用DROP SYNONYM语句。根据同义词的类型(私有或公有),你可能需要指定相应的权限。

以下是如何删除同义词的步骤:

  1. 确定要删除的同义词名称
    首先,你需要知道你想要删除的同义词的名称。你可以通过查询DBA_SYNONYMSALL_SYNONYMSUSER_SYNONYMS视图来获取这些信息。

  2. 使用DROP SYNONYM语句
    一旦你知道了同义词的名称,你就可以使用DROP SYNONYM语句来删除它。

     

    对于私有同义词(只由当前用户拥有的),你可以直接执行以下语句:

    DROP SYNONYM synonym_name;

    其中synonym_name是你要删除的同义词的名称。

    对于公有同义词(由所有用户共享的),你需要使用PUBLIC关键字,但通常只有DBA或具有相应权限的用户才能删除公有同义词:

    DROP PUBLIC SYNONYM synonym_name;
  3. 确保你有足够的权限
    删除同义词需要相应的权限。如果你没有权限,你可能需要联系你的数据库管理员或者使用有足够权限的用户来执行这个操作。

  4. 注意依赖对象
    在删除同义词之前,请确保没有数据库对象(如视图、存储过程、触发器等)依赖于这个同义词。如果有依赖对象,你可能需要先修改或删除这些对象,然后再删除同义词。

  5. 备份
    在删除任何数据库对象之前,始终建议进行备份。这可以在出现错误或意外情况时提供恢复选项。

  6. 检查是否删除成功
    执行完DROP SYNONYM语句后,你可以查询DBA_SYNONYMSALL_SYNONYMSUSER_SYNONYMS视图来确认同义词是否已被成功删除。

请注意,执行DROP SYNONYM语句后,同义词将被永久删除,并且无法恢复(除非你有备份)。因此,在执行此操作之前,请务必谨慎考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HNU-操作系统OS-2024期中考试

前言 该卷为22计科/智能OS期中考卷。 感谢智能22毕宿同学记忆了考卷考题。 同学评价:总体简单;第1,7概念题较难需要看书;第4,5题原题。 欢迎同学分享答案。 【1】共10分 操作系统的设计目标有哪些? 【…

安卓surfaceview的使用方式

1. 什么是surfaceview surfaceview内部机制和外部层次结构 在安卓开发中,我们经常会遇到一些需要高性能、高帧率、高画质的应用场景,例如视频播放、游戏开发、相机预览等。这些场景中,我们需要直接操作图像数据,并且实时地显示到…

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)

实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标:(1)注册新大陆云平台;(2)新建一个联网方案为WIFI的项目;(3)ESP8266模块,通过AT指令访问…

电商购物系统首页的商品分类

如上图对商品的一个分类实际上和省市区的分类十分类似 , 都是通过自关联的方法来实现 , 但是这里不同的是 , 涉及到外键来获取数据 首先让我们来看一下最后通过后端返回数据的形式是什么样子的 """{1:{channels:[{id:1 , name:手机 , url:},{}{}],sub_cats:[{…

Vue报错:TypeError: Cannot read property ‘upgrade‘ of undefined

Vue报错:TypeError: Cannot read property ‘upgrade’ of undefined 前言 最近打开一个很就之前的开发项目,因为扫描包,所以删除了部分代码,后来就一直报错,现在总结一下。 报错原因:vue.config.js中 d…

力扣HOT100 - 74. 搜索二维矩阵

解题思路&#xff1a; 两次二分&#xff0c;第一次定位行&#xff0c;第二次定位列。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int l 0, r m - 1;//定位行int row -1;while (l < r) {in…

【机器学习300问】86、简述超参数优化的步骤?如何寻找最优的超参数组合?

本文想讲述清楚怎么样才能选出最优的超参数组合。关于什么是超参数&#xff1f;什么是超参数组合&#xff1f;本文不赘述&#xff0c;在之前我写的文章中有详细介绍哦&#xff01; 【机器学习300问】22、什么是超参数优化&#xff1f;常见超参数优化方法有哪些&#xff1f;htt…

Web3探索加密世界:如何避免限制并增加空投成功的几率

今天分享空投如何避免限制以提高效率&#xff0c;增加成功几率&#xff0c;首先我们来了解什么是空投加密&#xff0c;有哪些空投类型。 一、什么是空投加密&#xff1f; 加密货币空投是一种营销策略&#xff0c;包括向用户的钱包地址发送免费的硬币或代币。 加密货币项目使用…

BM7 链表中环的入口结点(快慢指针模板题)

描述 给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。 数据范围&#xff1a; &#x1d45b;≤10000n≤10000&#xff0c;1<结点值<100001<结点值<10000 要求&#xff1a;空间复杂度 &…

第02章 计算机网络概述

2.1 本章目标 了解计算机网络的定义了解计算机网络的功能了解计算机网络的分类了解计算机网络的组成 2.2 计算机网络的定义 2.3 计算机网络的功能 2.4 计算机网络的分类 物理拓扑结构分类&#xff1a;总线型、环型、星型 2.5 计算机网络的组成 网络适配器(NIC)接口规格分类&a…

阮怀俊谈如何盘活和挖掘乡村文旅资源

近年来&#xff0c;浙江凭借高水平建设新时代美丽乡村&#xff0c;各项工作持续走在全国前列&#xff0c;最近&#xff0c;在国家发展改革委关于恢复和扩大消费措施的通知中也提到&#xff1a; “推广浙江‘千万工程’经验&#xff0c;建设宜居宜业和美乡村。实施文化产业赋能乡…

报告!Golang冲上来啦!

今天又来讲Go语言&#xff0c;根据全球知名的编程语言排行榜TIOBE在4月份公布的最新的编程语言排名&#xff0c;令人瞩目的是&#xff0c;Go语言已经跃升至历史最高位&#xff0c;位列排行榜第七名&#xff0c;并且Go语言是前十榜单中最年轻的编程语言。这一成绩不仅彰显了Go语…

哈希表Hash table

哈希表是根据关键码的值而直接进行访问的数据结构。 数组就是⼀张哈希表。 哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff0c;如下图所示&#xff1a; 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断⼀个元素是…

【JavaScript】DOM 事件的传播机制

事件与事件流 事件&#xff0c;这里指和网页进行互动。比如点击链接&#xff0c;移动鼠标等网页被触发&#xff0c;做出响应&#xff0c;形成交互。 js 采用事件监听器来监听事件是否发生。 事件流 事件流描述了从页面中接收事件的顺序。当一个事件发生在某个元素上时&…

【二叉树】Leetcode N 叉树的层序遍历

题目讲解 429. N 叉树的层序遍历 算法讲解 在做层序遍历的时候由于它的每一个结点是有val vector child组成&#xff0c;所以在做层序遍历的时候需要考虑它每一层结点的个数&#xff0c;那我们就可以使用一个queue保存每一层的结点&#xff1b;那么我们在做第一层的时候&am…

B端弹窗设计指南,3000字讲清楚,内附大量案例。

B端系统弹窗是指在企业级&#xff08;Business to Business&#xff09;系统中&#xff0c;弹出的窗口或对话框&#xff0c;用于向用户展示信息、提供操作选项或者收集用户输入。 一、B端系统弹窗的作用 作用如下&#xff1a; 提示和通知&#xff1a;弹窗可以用于向用户展示重…

一个全栈SpringBoot项目-Book Social Network

一个全栈SpringBoot项目-Book Social Network BSN是一个会员之间交换图书的社交网络平台。图书社交网络是一个全栈应用程序&#xff0c;使用户能够管理他们的图书收藏并与图书爱好者社区互动。它提供的功能包括用户注册、安全电子邮件验证、图书管理&#xff08;包括创建、更新…

(java)websocket服务的两种实现方式

1.基于java注解实现websocket服务器端 1.1需要的类 1.1.1服务终端类 用java注解来监听连接ServerEndpoint、连接成功OnOpen、连接失败OnClose、收到消息等状态OnMessage 1.1.2配置类 把spring中的ServerEndpointExporter对象注入进来 2.1代码示例 2.1.1 maven配置 <…

【前端】桌面版docker并部署前端项目

环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个&#xff0c;不然一直转圈圈 镜像配置加速&#xff0c;在settings—>docker engine下 {"builder": {"gc": {"defaultKee…

【RAG 论文】AAR:训练一个LLM喜欢的检索器来做RAG

论文&#xff1a;Augmentation-Adapted Retriever Improves Generalization of Language Models as Generic Plug-In ⭐⭐⭐ ACL 2023, Tsinghua & Microsoft&#xff0c;arXiv:2305.17331 论文速读 以往 RAG 的工作通常联合微调 retriever 和 LLM 导致紧密耦合&#xff0…