在PL/SQL中,您创建了一个新函数,该函数具有以下标头和声明部分



FUNCTION EMPLOYEE_JOINING_DATE(p_emp_id IN NUMBER(退货日期是v_emp_join_date日期;开始

以下哪项语句不被编译器接受?

  1. 返回系统日期
  2. RETURN("未找到日期"(
  3. 返回日期(_date(
  4. 这些都没有

第三个,因为oracle在编译时检查未声明的变量。第二个将只在运行时返回强制转换错误。

答案可以是3或4:

选项1:

CREATE OR REPLACE FUNCTION EMPLOYEE_JOINING_DATE (
p_emp_id IN NUMBER
)
RETURN DATE
IS
v_emp_join_date DATE;
BEGIN
RETURN SYSDATE;
END;
/

编译时没有错误。

选项2:

CREATE OR REPLACE FUNCTION EMPLOYEE_JOINING_DATE (
p_emp_id IN NUMBER
)
RETURN DATE
IS
v_emp_join_date DATE;
BEGIN
RETURN ('no date found');
END;
/

编译时没有错误。

如果您尝试执行程序:

DECLARE
v_date DATE;
BEGIN
v_date := EMPLOYEE_JOINING_DATE( 1 );
DBMS_OUTPUT.PUT_LINE( TO_CHAR( v_date, 'YYYY-MM-DD' ) );
END;
/

然后它将输出一个异常:

ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at "FIDDLE_BUISIFXHIMAYWYOGMYBY.EMPLOYEE_JOINING_DATE", line 8
ORA-06512: at line 4

但是,这是一个运行时异常,而不是编译时错误。

然而,如果你做了一些非常愚蠢的事情:

ALTER SESSION SET NLS_DATE_FORMAT = '"no date found"';

然后PL/SQL块和函数无错误运行,并输出当月的第一个:

2020-09-01

选项3,版本1:

CREATE OR REPLACE FUNCTION EMPLOYEE_JOINING_DATE (
p_emp_id IN NUMBER
)
RETURN DATE
IS
v_emp_join_date DATE;
BEGIN
RETURN v_date;
END;
/

给出以下编译时错误:

SELECT * FROM USER_ERRORS;
NAME|TYPE|SEQUENCE|LINE|POSITION|TEXT|ATTRIBUTE|MESSAGE_NUMBER:--------------------------------------------EMPLOYEE_JOINING_DATE | FUNCTION |1 | 8 | 10 | PLS-00201:必须声明标识符"V_DATE"| ERROR | 201EMPLOYEE_JOINING_DATE | FUNCTION | 2|8|3|PL/SQL:忽略语句| ERROR | 0

选项3,版本2:

但是,如果您将程序设置为:

CREATE OR REPLACE FUNCTION EMPLOYEE_JOINING_DATE (
p_emp_id IN NUMBER
)
RETURN DATE
IS
v_emp_join_date DATE;
BEGIN
DECLARE
v_date DATE := DATE '1970-01-01';
BEGIN
RETURN v_date;
END;
END;
/

然后它编译并运行时没有出现错误。

如果您采用选项3的第二个版本,并在嵌套块中声明v_date,那么答案是#4;然而,如果你只是天真地使用RETURN v_date;而不去关心v_date,那么答案是#3。

db<gt;小提琴这里

最新更新