【问题标题】:Oracle Function Return CHAROracle 函数返回 CHAR
【发布时间】:2023-03-27 17:18:01
【问题描述】:

我编写了一个返回 CHAR 的函数 (FN_TEST_BE8)。

create or replace FUNCTION FN_TEST_BE8 
( P_PARAM1 IN Char
, P_PARAM2 IN Char
) RETURN Char AS 
BEGIN
  RETURN P_PARAM2;
END FN_TEST_BE8;

我的问题是,当我运行它时,它会返回一个 VARCHAR2,对我来说这是个问题。

SELECT FN_TEST_BE8('XX','YY') RESULT
  FROM  DUAL

由于我在 where 条件下使用该函数,这迫使我强制转换结果:

SELECT *
  FROM TABLE1
 WHERE CHAR_2 = CAST(FN_TEST_BE8('XX','YY') AS CHAR(2));
 --  DOES NOT WORK --> WHERE CHAR_2 = FN_TEST_BE8('XX','YY');

“TABLE 1.CHAR_2”字段定义为 CHAR (2)。 如果我使用带有“NOT WORK”标签注释的 WHERE CONDICTION,则语句不会提取数据。 如果我对 FUNCTION 的结果强制 CAST,语句会正确提取数据。

有两点不明白

  • PL/SQL 支持“char”数据类型。为什么函数不提取 CHAR 而是提取 VARCHAR2?
  • 我原以为 Oracle 数据库会自动将值从一种 CHAR 数据类型转换为 VARCHAR2 数据类型

感谢您的帮助。

【问题讨论】:

  • "DOES NOT WORK --> WHERE CHAR_2 = FN_TEST_BE8('XX','YY'); 究竟是什么意思?意思是?一般来说,VARCHAR2 使用起来更简单,因为 CHAR 用空格右填充,直到它的全长。你注意了吗?
  • 嗨,@Littlefoot。我编辑了帖子并指定了“不工作”的意思是的,我已经考虑了 CHAR 和 VARCHAR2 之间的区别,但我无法更改数据库上字段的定义。如果当我将 CHAR 字段与 VARCHAR2 进行比较时,函数提取了 VARCHAR2,则选择不会提取数据,我不明白为什么。我原以为 Oracle 数据库会自动将值从一种 CHAR 数据类型转换为 VARCHAR2 数据类型
  • 我做了一些测试,作为答案发布(无法放入评论)。请看一下。

标签: function plsql oracle11g


【解决方案1】:

在我的 11gXE 上,一切似乎都很好。

表格和功能:

SQL> desc table1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CHAR_2                                             CHAR(2)

SQL> select * from table1;

CH
--
XX
YY

SQL> create or replace function fn_test_be8 (p_param1 in char, p_param2 in char)
  2     return char
  3  as
  4  begin
  5     return p_param2;
  6  end fn_test_be8;
  7  /

Function created.

SQL>

测试:所有查询都返回结果:

SQL> select fn_test_be8 ('XX', 'YY') result from dual;

RESULT
--------------------------------------------------------------------------------
YY

SQL> select *
  2    from table1
  3   where char_2 = cast (fn_test_be8 ('XX', 'YY') as char (2));

CH
--
YY

SQL> select *
  2    from table1
  3   where char_2 = fn_test_be8 ('XX', 'YY');

CH
--
YY

SQL>

您使用哪个数据库版本?你能做同样的测试,发布完全我所做的和我做的方式,在 SQL*Plus 中执行吗?

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多