首页 > 解决方案 > 带有函数返回 VARCHAR2 的 WITH 子句

问题描述

我需要使用 WITH 子句中的函数编写 SQL 查询。

`

WITH
  FUNCTION with_function(p_id IN NUMBER) RETURN VARCHAR2 IS
    l_pid VARCHAR2(38);
  BEGIN
    SELECT TO_CHAR(p_id) INTO l_pid FROM dual;
    RETURN l_pid;
  END;
SELECT with_function(2.23327463784638764)
FROM   DUAL;

`

传递给的值的长度with_function可以变化。因此,当长度大于 38l_pid VARCHAR2(38);时将不起作用。我可以在声明它时给出最大长度(32767),或者我可以使用没有参数的过程,但我想知道是否有任何其他方法可以不对长度进行硬编码在 WITH 子句中使用函数时。p_idp_id

标签: sqloracleplsql

解决方案


ANUMBER最多只能存储 38 位的精度

NUMBER [ (p [, s]) ]

具有精度p和规模的数字s。精度p范围可以从 1 到 38。s小数位数范围可以从 -84 到 127。精度和小数位数都是十进制数字。一个NUMBER值需要 1 到 22 个字节。

因此,您需要的最大长度为 40 个字符(带小数点和负号),因为任何大于该长度的精度在存储为 时都会丢失NUMBER

WITH
  FUNCTION with_function(p_id IN NUMBER) RETURN VARCHAR2 IS
    l_pid VARCHAR2(40);
  BEGIN
    SELECT TO_CHAR(p_id) INTO l_pid FROM dual;
    RETURN l_pid;
  END;
data ( value ) AS (
  SELECT 1234567898012345678980123456789801234567898012345678980 FROM DUAL UNION ALL
  SELECT 1234567898012345678980.123456789801234567898012345678980 FROM DUAL UNION ALL
  SELECT 0.1234567898012345678980123456789801234567898012345678980 FROM DUAL UNION ALL
  SELECT -1234567898012345678980123456789801234567898012345678980 FROM DUAL UNION ALL
  SELECT -1234567898012345678980.123456789801234567898012345678980 FROM DUAL UNION ALL
  SELECT -0.1234567898012345678980123456789801234567898012345678980 FROM DUAL
)
SELECT with_function(value)
FROM   data;

输出:

WITH_FUNCTION(值)
1.2345678980123456789801234567898012E+54
1234567898012345678980.12345678980123457
.123456789801234567898012345678980123457
-1.234567898012345678980123456789801E+54
-1234567898012345678980.1234567898012346
-.12345678980123456789801234567898012346

db<>在这里摆弄


推荐阅读