【发布时间】: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 数据类型
-
我做了一些测试,作为答案发布(无法放入评论)。请看一下。