gpt4 book ai didi

oracle - PL/SQL 函数值的间隔精度

转载 作者:行者123 更新时间:2023-12-04 12:38:15 27 4
gpt4 key购买 nike

通常,当您指定函数时,返回数据类型的比例/精度/大小是未定义的。

例如,您说 FUNCTION show_price RETURN NUMBERFUNCTION show_name RETURN VARCHAR2 .

您不能拥有 FUNCTION show_price RETURN NUMBER(10,2)FUNCTION show_name RETURN VARCHAR2(20) ,且函数返回值不受限制。 This is documented functionality.

现在,如果我将 9999 小时(大约 400 天)插入以下内容,则会出现精度错误 (ORA-01873)。限制是因为 the default days precision is 2

DECLARE
v_int INTERVAL DAY (4) TO SECOND(0);
FUNCTION hhmm_to_interval return INTERVAL DAY TO SECOND IS
v_hhmm INTERVAL DAY (4) TO SECOND(0);
BEGIN
v_hhmm := to_dsinterval('PT9999H');
RETURN v_hhmm;
--
END hhmm_to_interval;
BEGIN
v_int := hhmm_to_interval;
end;
/

并且它不允许将精度直接指定为函数返回的数据类型的一部分。
DECLARE
v_int INTERVAL DAY (4) TO SECOND(0);
FUNCTION hhmm_to_interval return INTERVAL DAY (4) TO SECOND IS
v_hhmm INTERVAL DAY (4) TO SECOND(0);
BEGIN
v_hhmm := to_dsinterval('PT9999H');
RETURN v_hhmm;
--
END hhmm_to_interval;
BEGIN
v_int := hhmm_to_interval;
end;
/

我可以使用子类型
DECLARE
subtype t_int is INTERVAL DAY (4) TO SECOND(0);
v_int INTERVAL DAY (4) TO SECOND(0);
FUNCTION hhmm_to_interval return t_int IS
v_hhmm INTERVAL DAY (4) TO SECOND(0);
BEGIN
v_hhmm := to_dsinterval('PT9999H');
RETURN v_hhmm;
--
END hhmm_to_interval;
BEGIN
v_int := hhmm_to_interval;
end;
/

子类型方法有什么缺点吗?

任何替代方案(例如更改默认精度的某个地方)?

使用 10gR2。

最佳答案

没有我能想到的真正缺点。我认为如果将工作变量声明为子类型的实例会更清楚一些,例如:

DECLARE 
subtype t_int is INTERVAL DAY (4) TO SECOND(0);

v_int t_int;

FUNCTION hhmm_to_interval return t_int IS
v_hhmm t_int;
BEGIN
v_hhmm := to_dsinterval('PT9999H');
RETURN v_hhmm;
END hhmm_to_interval;

BEGIN
v_int := hhmm_to_interval;
DBMS_OUTPUT.PUT_LINE('v_int=' || v_int);
end;

分享和享受。

关于oracle - PL/SQL 函数值的间隔精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com