PL/SQL输入日期存入变量报PLS-00201错误如何解决
报错原因排查
一共存在4处错误,按触发优先级排列如下:
- 替换变量未加引号导致解析错误
你使用的&today是Oracle SQL*Plus类工具的替换变量,若输入18-Sep-09时未主动包裹单引号,Oracle会将输入内容解析为表达式,把-识别为减号,尝试计算18 - SEP - 09,但SEP没有被定义为变量,直接触发当前报错。 - 日期格式掩码错误
Oracle的TO_DATE函数中,3字符英文月份缩写对应的掩码是MON,你写的MMM不属于合法的Oracle日期格式掩码,即使解决了引号问题也会抛出格式不匹配报错。 - 变量名引用错误
定义v_tomorrow时,你直接使用了未声明的today变量,正确应该引用已经声明的v_today变量。 - 内置包名拼写错误
输出用的内置包正确名称是DBMS_OUTPUT,你写的DMBS_OUTPUT拼写顺序错误,后续运行也会触发标识符不存在报错。
修复后的完整代码
SET SERVEROUTPUT ON DECLARE v_today DATE := TO_DATE('&today', 'YY-MON-DD', 'NLS_DATE_LANGUAGE = AMERICAN'); v_tomorrow v_today%TYPE := v_today + 1; BEGIN DBMS_OUTPUT.PUT_LINE('Today is: ' || TO_CHAR(v_today, 'YYYY-MM-DD')); DBMS_OUTPUT.PUT_LINE('Tomorrow will be: ' || TO_CHAR(v_tomorrow, 'YYYY-MM-DD')); END; /
使用说明
运行代码后,在弹出的替换变量输入框中直接输入18-Sep-09即可,无需额外加单引号。代码中额外指定了NLS_DATE_LANGUAGE参数,避免数据库默认语言不是英文时,无法识别Sep这类英文月份缩写的问题。
内容的提问来源于stack exchange,提问作者Abel Asres
相关产品推荐
相关产品推荐

