【问题标题】:PLS-00382: expression is of wrong type. PL/SQL: Statement ignoredPLS-00382:表达式类型错误。 PL/SQL:语句被忽略
【发布时间】:2021-09-10 00:04:29
【问题描述】:

我尝试使用函数重载执行一个简单的包。下面是包代码。

--package specification:
create or replace package over_load as
    FUNCTION print_it(v_date date) return date;
    FUNCTION print_it(v_name varchar2) return number;
end over_load;

--package body:
create or replace package body over_load as
    FUNCTION print_it(v_date date) return date is --function accepting and returning date
        begin
        dbms_output.put_line('the date is ' || v_date);
        return v_date;
    end print_it;

    FUNCTION print_it(v_name varchar2) return number is /*function accepting string and returning number*/
        v_eno employees.employee_id%type;
        begin
        select employee_id into v_eno from employees where first_name = v_name;
        return v_eno;
        end print_it;
    end over_load;

我尝试使用下面的匿名块执行包中的第一个函数。

declare
sample_date date;
begin
sample_date := over_load.print_it('14-07-2017');
dbms_output.put_line(sample_date);
end;

我尝试将日期作为参数传递给第一个函数,但它会引发错误的参数类型错误。知道为什么吗?

【问题讨论】:

  • '14-07-2017' 不是日期,它是根据documentationliterals 部分的文本文字。日期文字是date '2017-07-14'

标签: sql oracle plsql plsql-package


【解决方案1】:

如果过程(或函数)需要 DATE 数据类型,则不要将 string 传递给它。因为,'14-07-2017' 是一个字符串。

SQL> set serveroutput on
SQL>
SQL> declare
  2    sample_date date;
  3  begin
  4    --sample_date := over_load.print_it('14-07-2017');
  5    sample_date := over_load.print_it(date '2017-07-14');
  6    dbms_output.put_line(sample_date);
  7  end;
  8  /
the date is 14.07.17
14.07.17

PL/SQL procedure successfully completed.

SQL>

在第 5 行,我传递了一个日期文字。也可以是to_date('14-07-2017', 'dd-mm-yyyy')

Oracle - 如果可以的话 - 将您传递的内容隐式转换为它期望的数据类型,但它并不总是成功;这取决于 NLS 设置。

为确保它始终有效,请控制它并使用适当的数据类型。

【讨论】:

  • 嗨,我已经尝试过 to_date('14-07-2017', 'dd-mm-yyyy') 并且成功了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多