简介:这套Oracle 19c原题资料(PDF)第一部分,定位为Oracle Database 19c认证科目1Z0-082的备考题库,适合已掌握SQL基础、正在冲刺认证的数据库从业者与学生。内容以英文原题带答案解析的方式呈现,开篇即覆盖DROP TABLE操作带来的实际影响,包括被删除表是否进入回收站、约束与索引的联动删除,以及序列、同义词和视图不受影响的边界判断;同时梳理本地命名、目录命名和EasyConnect三类连接解析方式各自的前置条件与故障切换能力,并对多行子查询的GROUP BY、HAVING用法及WHERE条件组合等易混淆点给出逐一辨析。每道题均标明正确选项,并附简短解释,便于考生对照错因、强化记忆。包体为单个PDF文件,大小仅674KB,轻量便携,适合手机或电脑随时刷题。目前已有594人学习下载,属于高频使用的考试复习材料。通过研读这些原题,可帮助读者熟悉1Z0-082的真实出题风格与选项陷阱,深入理解Oracle 19c在数据字典、连接解析、子查询与条件逻辑方面的细节,从而提升答题准确率,为正式考试做好针对性准备。
1. 这份 Oracle 19c 原题资料:不只是刷题,是把考点还原成实操
先说结论:这份 PDF 与其说是 1Z0-082 的题库,不如说是一份「以题带点」的 Oracle 19c 知识点索引。每一道题背后都是一个可以在 SQL*Plus 里亲手验证的行为——DROP TABLE 到底动了哪些对象、目录命名要不要配 TNS_ADMIN、多行子查询能不能带 GROUP BY,这些不是死记硬背的答案,而是可以在自己 19c 环境里敲一遍就能看到结果的东西。适合两类人:一类是备考 OCP 1Z0-082 的考生,需要把零散知识点串成体系;另一类是日常维护 Oracle 19c 的 DBA,想补一补 SQL 语义边界和 Net Services 配置细节。资料本身是 PDF 格式,题目按 Exam A 顺序排列,答案解析紧跟其后,这份「原题 + 解析」的结构决定了它更适合做第二轮复习——第一轮看书建体系,第二轮拿它查漏。
2. 围绕 DROP TABLE 的隐式依赖:从回收站到索引约束的连锁反应
2.1 DROP TABLE 到底动了谁:序列、同义词、视图、索引、约束的各自命运
题面问的是DROP TABLE hr.employees之后哪些说法为真,标准答案是 DEF——索引和约束随表删除,表进回收站。但更值得琢磨的是另外三个选项为什么是错的,这背后是 Oracle 对依赖对象的分类处理逻辑。
A 选项说序列会被删,错。序列是独立对象,不归属于某个表。你在 employees 表上建过EMP_SEQ,DROP TABLE 之后这个序列还在,只是它 nextval 产生的值不再被任何列消费而已。B 选项说同义词被删,也错。公共同义词和私有同义词都是独立对象,DROP TABLE 只删除表本身,同义词会变成「失效状态」——你查询它时会报 ORA-00980,但同义词这个对象还在数据字典里。C 选项说视图被删,同样错。视图是依赖表的独立对象,表被 drop 后视图还在,只是变成 invalid,需要ALTER VIEW ... COMPILE或者等下次访问时自动重新编译,编译失败就报错。
而 E 和 F 为什么对?因为约束和索引是表的附属段——主键约束、唯一约束、检查约束、外键约束都定义在表结构上,表没了它们自然没了;索引无论是普通 B-tree 还是函数索引,物理上都存储在表所在的表空间里,DROP TABLE 时 Oracle 会连同索引段一起清理。D 选项涉及回收站机制,从 10g 开始默认开启,DROP TABLE不是物理删除,而是把表和它的相关段改名放进回收站,你可以用FLASHBACK TABLE hr.employees TO BEFORE DROP恢复。
实操验证方式很简单:
-- 先建一张测试表,带上主键、索引、序列和同义词 CREATE TABLE hr.employees_test AS SELECT * FROM hr.employees WHERE 1=0; ALTER TABLE hr.employees_test ADD CONSTRAINT pk_emp_test PRIMARY KEY (employee_id); CREATE INDEX idx_emp_test_name ON hr.employees_test(last_name); CREATE SEQUENCE seq_emp_test START WITH 1; CREATE SYNONYM syn_emp_test FOR hr.employees_test; -- 执行 DROP 后检查依赖对象 DROP TABLE hr.employees_test; SELECT object_name, object_type, status FROM user_objects WHERE object_name LIKE '%EMP_TEST%'; SELECT object_name, object_type FROM user_objects WHERE object_name IN ('SEQ_EMP_TEST','SYN_EMP_TEST');第一条查询能看到回收站里的表名被改成了BIN$...格式,索引和约束对应的记录也跟着进了回收站或消失;第二条查询能看到序列和同义词还在,同义词状态变成 INVALID。这就是为什么生产环境 DROP TABLE 之前一定要先查依赖——UTL层、报表层、ETL 任务都可能挂着同义词和视图,表一删,整条链路全断。
2.2 回收站带来的运维习惯:DROP 前查依赖,DROP 后留后悔药
回收站是「后悔药」,但也是磁盘黑洞。一张 500GB 的表被 DROP 后,段还在回收站里占着空间,表空间剩余空间不会变多。这时候如果业务要扩表,你会惊讶地发现空间不够——不是没空间,是空间被回收站占着。
我的习惯是两件事并行。第一,DROP 之前先查依赖:
-- 查引用该表的外键约束 SELECT owner, constraint_name, table_name, status FROM all_constraints WHERE r_constraint_name IN ( SELECT constraint_name FROM all_constraints WHERE table_name = 'EMPLOYEES' AND owner = 'HR' ); -- 查依赖该表的视图和同义词 SELECT owner, name, type, status FROM all_dependencies WHERE referenced_name = 'EMPLOYEES' AND referenced_owner = 'HR';第二,DROP 之后立刻确认回收站占用,该清就清:
-- 查看回收站空间占用 SELECT owner, tablespace_name, SUM(bytes)/1024/1024 AS mb FROM dba_recyclebin GROUP BY owner, tablespace_name; -- 只清特定表的回收站条目 PURGE TABLE hr.employees_test;这里有个细节:PURGE TABLE后面跟的是原始表名,不是回收站里的BIN$名。如果你同时 drop 了同名的表两次,回收站里会有两个BIN$条目,PURGE TABLE会把两个都清掉。想精确清一个,就得用PURGE TABLE "BIN$xxxxx$0"这种带引号的完整回收站名。
2.3 关于 DROP 的一个反直觉结论:CASCADE CONSTRAINTS 不是万能的
题目没提CASCADE CONSTRAINTS,但这是 DROP TABLE 最容易用错的选项。DROP TABLE ... CASCADE CONSTRAINTS只会级联删除外键约束,不会删视图、同义词、序列,更不会删引用该表的物化视图。很多人以为加了这个参数就能把依赖对象一锅端,实际上它只处理外键关系——比如 employees 表被 departments 表的外键引用,不加 CASCADE 直接 DROP 会报 ORA-02449,加了才能删掉。但视图和同义词依旧变成 invalid 状态留在库里。
所以生产环境删表,标准动作应该是:先查外键和依赖,再决定是CASCADE CONSTRAINTS还是手动 drop 外键,最后 DROP 完检查 invalid 对象数量有没有异常增长:
SELECT object_type, COUNT(*) FROM user_objects WHERE status = 'INVALID' GROUP BY object_type;3. Oracle Net 命名方法:TNS 解析的三种姿势与配置边界
3.1 从 tnsnames.ora 到 Easy Connect:三种命名方法的适用边界
1Z0-082 对网络命名方法的考查集中在 Local Naming、Directory Naming、Easy Connect 三者的配置条件和能力边界。题目答案选 CEF,但每个选项都值得展开。
Local Naming 是绝大多数单实例环境用的方式——客户端通过tnsnames.ora文件里的网络服务名去解析目标数据库的地址、端口和服务名。它要求客户端机器上设置了TNS_ADMIN环境变量指向 tnsnames.ora 所在目录,否则默认去$ORACLE_HOME/network/admin找。这就是 E 选项要表达的意思。但要注意:TNS_ADMIN不是必须设置的,如果你把文件放在默认位置,就不用管这个变量。所以「本地命名需要设置 TNS_ADMIN」这个说法本身就不严谨,准确说是「如果需要自定义文件位置,才要设置」。
Directory Naming 走的是 LDAP 目录服务器,客户端通过目录服务解析连接信息。B 选项说它需要设置TNS_ADMIN,这是错的——它需要配置的是LDAP_REGISTRATION_ENABLED和目录服务器地址,跟 TNS_ADMIN 没关系。C 选项说 Directory Naming 支持 Connect-Time Failover,这是对的。LDAP 里可以配置多个地址列表,客户端在连接时按顺序尝试,一个地址失败就换下一个。
Easy Connect 是最轻量的方式,不需要任何配置文件。客户端直接用host:port/service_name字符串就能连——比如sqlplus hr/hr@192.168.1.100:1521/orclpdb。D 选项说 Easy Connect 支持 TCP/IP 和 SSL,对的。19c 里 Easy Connect 的语法比早期版本丰富多了,支持net_service_name里带多个地址做 failover,也支持:dedicated/:shared指定服务器类型。
3.2 本地方案怎么选:单实例、RAC、DG 的不同推荐
实际配置时选哪种命名方法,取决于你的架构。单实例开发库,我无脑推荐 Easy Connect——零配置文件,一条连接串走天下。RAC 环境建议 Local Naming 配合地址列表做负载均衡和 failover。DG 环境同样是 Local Naming 更合适,因为主备切换后连接串不用改。Directory Naming 只在公司有统一 LDAP 基础设施、DBA 团队规模较大时才值得引入,否则维护 LDAP 的成本远大于收益。
配置 Local Naming 的标准动作:
# 1. 确认 TNS_ADMIN 指向的目录 echo $TNS_ADMIN # 如果为空,默认使用 $ORACLE_HOME/network/admin # 2. 编辑 tnsnames.ora,添加一个服务名条目 ORCL19C = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orclpdb) ) )参数说明:SERVER = DEDICATED表示每次连接分配专用服务器进程,适合开发测试;生产环境并发高时用SHARED走共享服务器进程。SERVICE_NAME是数据库的服务名,不是实例名——RAC 多个实例共用一个服务名,客户端连的是服务名,由监听把请求路由到实例。
验证配置用tnsping,这是最直接的连通性测试工具:
tnsping ORCL19C看到OK (10 msec)说明解析和网络都通。如果报ORA-12154: TNS:could not resolve the connect identifier specified,九成是 tnsnames.ora 路径不对或文件里有语法错误。
3.3 TNS_ADMIN 的隐性坑:多版本 Oracle 客户端共存时最容易翻车
一台机器上装了 11g 客户端和 19c 客户端,TNS_ADMIN只能指向一个目录。如果指向 11g 的 admin 目录,19c 的工具(比如 SQL*Plus 19c)也会用这个目录下的 tnsnames.ora——但 11g 和 19c 的 tnsnames.ora 语法不完全兼容,19c 特有的参数(比如CONNECT_TIMEOUT)在 11g 客户端里会被忽略或直接报错。
我一般这样规避:统一用 19c 的 admin 目录作为 TNS_ADMIN 指向,tnsnames.ora 里只写 11g 兼容的语法;或者干脆给不同版本的客户端分别建 admin 目录,启动脚本里按工具版本切换 TNS_ADMIN。一个更省事的方案是全部走 Easy Connect,彻底绕开 tnsnames.ora 的路径问题——反正 19c 的 Easy Connect 已经支持 failover 和负载均衡了,小规模环境完全够用。
4. SQL 语义与函数行为:把题目答案变成可验证的查询实验
4.1 多行子查询与 WHERE 条件优先级:AND 和 OR 的运算顺序陷阱
题目里关于多行子查询的正确答案是 ACE——可以包含 GROUP BY、HAVING,可能返回多个值。但 B 选项说「不能返回多个列」其实是错的:多行子查询完全可以返回多列,只要外层用元组比较或者 EXISTS 配合。D 选项说子查询里不能再嵌套子查询,这也是错的,子查询嵌套深度没有硬性限制。
WHERE 条件的题目更典型,它考察的是 AND 优先级高于 OR 这个基本规则。A 选项和 B 选项的差异就在于括号改变了逻辑分组:
-- A 等价于: borrowed_date = SYSDATE AND (transaction_type = 'RM' AND member_id IN ('A101','A102')) -- B 等价于: (borrowed_date = SYSDATE AND transaction_type = 'RM') OR member_id IN ('A101','A102')B 和 E 的结果一致,因为它们本质都是「日期等于今天且类型为 RM」或「会员 ID 在给定列表里」这两个条件的并集。这类题在开发中最常见的翻车场景是:你想表达「今天借阅的 RM 类型图书」,结果忘了加括号,SQL 变成了「今天借阅的 RM 类型图书或者所有会员 A101/A102 的借阅记录」——数据量一大,查询结果多出几千行。
验证这类优先级问题,不需要真实业务表,用 DUAL 就能做实验:
-- 模拟三个条件,观察不同括号组合下 WHERE 的筛选结果 WITH t AS ( SELECT 1 AS borrowed_date, 'RM' AS transaction_type, 'A101' AS member_id FROM dual UNION ALL SELECT 1, 'BK', 'A102' FROM dual UNION ALL SELECT 0, 'RM', 'A999' FROM dual ) SELECT * FROM t WHERE borrowed_date = 1 AND (transaction_type = 'RM' OR member_id IN ('A101','A102'));这段 SQL 返回第一行(日期对、类型对、会员对)和第三行(日期对、类型不对但会员 ID 在列表里)。把括号去掉再跑一次,结果完全不一样——第三行也会被筛掉,因为 AND 先执行,transaction_type = 'RM'为假,整体第一个条件就为假。这就是为什么代码评审时我要求所有多条件 WHERE 一律显式加括号,不靠默认优先级。
4.2 单行函数的三个易错点:TRUNC、FLOOR、CEIL 的行为差异
题目里 MOD 和 CEIL 的说法是对的,TRUNC 只能用于 NUMBER 是错的,FLOOR 的定义也写反了。这几个函数值得逐个验证:
-- MOD: 返回除法余数 SELECT MOD(17, 5) FROM dual; -- 2,注意余数符号跟随被除数 -- TRUNC: 支持 NUMBER 和 DATE 两种类型 SELECT TRUNC(99.99) FROM dual; -- 99,截断而不是四舍五入 SELECT TRUNC(99.99, 1) FROM dual; -- 99.9,保留一位小数 SELECT TRUNC(SYSDATE) FROM dual; -- 今天的 00:00:00 -- FLOOR: 返回小于等于参数的最大整数 SELECT FLOOR(99.99) FROM dual; -- 99 SELECT FLOOR(-99.99) FROM dual; -- -100,注意负数要向负无穷方向取整 -- CEIL: 返回大于等于参数的最小整数 SELECT CEIL(99.01) FROM dual; -- 100 SELECT CEIL(-99.99) FROM dual; -- -99TRUNC 最常见的误用是拿它做四舍五入——它只截断不四舍五入。要四舍五入用ROUND(99.99, 1)得到 100.0。FLOOR 和 CEIL 对负数的行为也常被忽视:FLOOR(-99.99) 是 -100 而不是 -99,CEIL(-99.99) 是 -99。这在财务计算里如果没注意符号,结果会差一整个整数。
CONCAT 函数的坑在于它只能接两个参数。CONCAT('a','b','c')会直接报 ORA-00909,你得嵌套:CONCAT(CONCAT('a','b'),'c')。而||运算符没有这个限制,可以无限拼接。所以题目里说 CONCAT 可以组合任意数量值,是错的。
4.3 BETWEEN、LIKE、IN 的等价写法:% 通配符和边界值
有一道题问WHERE city = '%AN%'和WHERE city IN ('%AN%')能不能查出正确结果——都不能。=和IN做的是精确匹配,%是通配符,只有LIKE才识别通配符。这个考点在开发环境里翻车率极高,尤其是从别的语言转过来的人,习惯了字符串模糊匹配用contains或=,到 Oracle 里就忘了 LIKE。
正确写法是:
-- 模糊匹配城市名包含 'AN' 的记录 WHERE city LIKE '%AN%'如果你想匹配以 A 或 B 开头的姓氏,可以用LIKE 'A%' OR LIKE 'B%',也可以用正则REGEXP_LIKE(last_name, '^[AB]')。但要注意BETWEEN的边界是闭区间——BETWEEN UPPER('A') AND UPPER('B%')这种写法是错的,BETWEEN 右边不能接通配符。
4.4 INTERVAL 数据类型:YEAR TO MONTH 和 DAY TO SECOND 的边界限制
关于 INTERVAL 的题目,标准答案是 DE。INTERVAL YEAR TO MONTH 支持年区间,但没有「月区间只能限制在单个年内」这回事——INTERVAL '13' MONTH完全合法,它表示 1 年零 1 个月。F 选项说 YEAR 字段必须为正数,也是错的,INTERVAL '-1' YEAR合法,表示往前一年。
实操里 INTERVAL 最常见的用法是计算时间差:
-- 计算两个日期间隔,结果类型是 INTERVAL DAY TO SECOND SELECT TO_TIMESTAMP('2025-01-15 10:30:00','YYYY-MM-DD HH24:MI:SS') - TO_TIMESTAMP('2025-01-14 08:00:00','YYYY-MM-DD HH24:MI:SS') AS diff_interval FROM dual; -- 把 INTERVAL 转为可读的天数和小时 SELECT EXTRACT(DAY FROM (SYSTIMESTAMP - TIMESTAMP '2025-01-14 08:00:00')) AS days_diff FROM dual;EXTRACT可以从 INTERVAL 里抽出年、月、日、时、分、秒。注意INTERVAL DAY TO SECOND的默认精度是 2 位秒,毫秒会被截断——想要毫秒得显式声明INTERVAL DAY(3) TO SECOND(6)。
5. 避坑与排查:1Z0-082 原题验证中的常见翻车记录
5.1 替代变量用 && 和 & 混搭,会话二次提示
现象:脚本里同时用了&emp_id和&&dept_id,跑第二次时emp_id还在提示输入,dept_id却不提示了。
原因:&每次执行都提示,&&只在该会话内提示一次,之后的值被缓存。这是 19c SQL*Plus 对替代变量的标准行为。
解决:如果希望某个变量在脚本里复用且只提示一次,统一用&&;每次都要提示的临时值用&。想强制重新提示&&变量,执行UNDEFINE dept_id清除缓存,或者在 SQL*Plus 里执行SET DEFINE ON重新开启。
5.2 ALTER DATABASE MOVE DATAFILE 时表还能查,DML 却报锁等待
现象:执行ALTER DATABASE MOVE DATAFILE '/u01/sales01.dbf' TO '/u02/sales02.dbf'过程中,SELECT 能跑,UPDATE 卡住直到命令完成。
原因:MOVE DATAFILE 在 12c+ 是 ONLINE 操作,允许查询,但移动过程中会对相关段短暂加锁,DML 要等文件移动完毕才能继续。题目答案 AB 说的就是这个。如果文件很大,这段时间可能很长,DML 堆积。
解决:生产环境移动大文件前先看文件大小和表空间使用率,估算移动时间;窗口期短就接受锁等待,窗口期长就考虑用DBMS_FILE_TRANSFER先复制到目标位置,再切换。另外注意:MOVE DATAFILE不能跨平台,/u01和/u02在同一个操作系统的不同挂载点没问题,跨操作系统类型要用RMAN CONVERT。
5.3 SQL*Plus 里跑题目 SQL,报错 ORA-00933 或 ORA-00923
现象:从 PDF 里复制题目 SQL 到 SQL*Plus,经常报ORA-00933: SQL command not properly ended或ORA-00923: FROM keyword not found where expected。
原因:PDF 里可能有不可见字符、全角逗号、弯引号。题目里的引号、逗号、括号经常被 PDF 排版转成 Unicode 字符,SQL*Plus 不认。
解决:复制后先粘到记事本或 VS Code 里做一次「全角转半角」,再粘到 SQL*Plus。更稳的方式是自己手敲关键部分,别直接复制。写脚本时用cat或vi确认文件编码是 UTF-8 无 BOM。
5.4 SYSDATE 和字符串比较,隐式转换导致全表扫描
现象:WHERE join_date > '10-02-2018'能出结果,但执行计划显示全表扫描,线上数据量大时慢得离谱。
原因:NLS_DATE_FORMAT 是 DD-MON-YY,字符串 '10-02-2018' 被隐式转成日期时用的是DD-MON-YY格式,'10-02-2018' 月份部分 '02' 不是 MON 格式,Oracle 可能报错或按错误语义解析。这题答案选 C 就是因为它是唯一需要显式 TO_DATE 的选项。
解决:日期比较永远用TO_DATE('2018-10-02','YYYY-MM-DD')显式转换,别依赖 NLS 隐式转换。顺便检查一下NLS_DATE_FORMAT和NLS_TIMESTAMP_FORMAT是否一致,不一致会在不同会话出现诡异结果。
5.5 序列缓存值在实例关闭后丢失,业务出现断号
现象:数据库正常关闭再启动,序列 nextval 跳了一大截,主键出现空洞。
原因:序列CACHE默认 20,实例关闭时缓存里未使用的值直接丢弃,下次启动从磁盘记录的下一个值开始。这不是 bug,是设计行为。题目答案说「序列未分配的缓存值在实例关闭时会丢失」就是这个。
解决:核心业务表如果要求主键严格连续,用NOCACHE但性能下降;能接受断号就保持默认 CACHE。两种方案没有绝对对错,关键是业务方要提前确认。
5.6 考试环境与生产环境行为不一致,答案在 19c 和 21c 有差异
现象:在 21c 上验证题目答案,发现和 PDF 给的参考答案不一致,尤其是回收站行为和默认值相关题目。
原因:Oracle 不同版本对默认行为和对象处理有调整,21c 的一些默认参数和 19c 不一样。题目是 19c 原题,答案约定在 19c 环境成立。
解决:验证题目统一用 19c 环境,最好是19.17+的补丁版本。虚拟机装 19c 时选择 Enterprise Edition,别用 XE——XE 的功能阉割可能影响结果。
6. 用 SQL*Plus 做一套自测错题复盘脚本:把原题变成可持续用的验证工具
PDF 题目刷完一遍之后,真正拉开差距的是错题复盘。我习惯把每道错题整理成一条 SQL 脚本,跑一遍看实际输出,把答案背后的行为验证一遍。这里给一套我经常用的脚本模板,直接存成.sql文件在 SQL*Plus 里执行。
-- 文件名: verify_questions.sql -- 用法: sqlplus hr/hr@orclpdb @verify_questions.sql SET ECHO ON SET FEEDBACK OFF SET LINESIZE 200 SET PAGESIZE 100 SET SERVEROUTPUT ON -- 实验1: 验证 DROP TABLE 后同义词的状态 CREATE TABLE t_verify AS SELECT 1 AS id FROM dual; CREATE SYNONYM syn_verify FOR t_verify; DROP TABLE t_verify; SELECT object_name, object_type, status FROM user_objects WHERE object_name = 'SYN_VERIFY'; -- 实验2: 验证 WHERE 优先级 WITH t AS ( SELECT 1 AS borrowed_date, 'RM' AS transaction_type, 'A101' AS member_id FROM dual UNION ALL SELECT 1, 'BK', 'A102' FROM dual UNION ALL SELECT 0, 'RM', 'A999' FROM dual ) SELECT * FROM t WHERE borrowed_date = 1 AND (transaction_type = 'RM' OR member_id IN ('A101','A102')); -- 实验3: 验证 FLOOR 和 CEIL 对负数的行为 SELECT FLOOR(-99.99) AS floor_neg, CEIL(-99.99) AS ceil_neg FROM dual; -- 实验4: 验证多行子查询能否带 GROUP BY SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 1; SET FEEDBACK ON SET ECHO OFF这段脚本的逻辑说明:第一个实验验证同义词不随表删除而消失,状态变 INVALID;第二个实验验证括号对 WHERE 逻辑分组的影响;第三个实验验证 FLOOR 和 CEIL 对负数的取整方向;第四个实验验证多行子查询确实可以包含 GROUP BY 和 HAVING。每条实验的预期输出你可以在跑之前先自己推理一遍,跑完对比,推理错误的地方就是你的知识盲区。
复盘时我习惯在脚本里直接写注释,标注「预期结果」和「实际结果」:
-- 实验5: 验证 INTERVAL 的 YEAR 字段是否必须为正 -- 预期: INTERVAL '-1' YEAR 合法,返回 -1 -- 实际: 合法,说明题目 F 选项错误 SELECT INTERVAL '-1' YEAR FROM dual;这个习惯帮我解决过一个实际问题:团队的 ETL 脚本里用了TRUNC(SYSDATE) - 1取昨天的数据,某天发现少了当天的数据。排查半天发现有人在脚本里把TRUNC(SYSDATE)改成了SYSDATE去比较,导致边界时间条件失效。从那以后,凡是涉及日期边界的 SQL,我都强制在验证脚本里跑一遍TO_CHAR(TRUNC(SYSDATE), 'YYYY-MM-DD HH24:MI:SS'),确认时间点再上线。
这套验证脚本的价值不只是备考,它本身就是一个可复用的 SQL 行为测试集。你每遇到一个拿不准的行为,就往里加一条实验,跑一遍看结果,错题本会越来越薄。希望帮到你。
本文还有配套的精品资源,点击获取