首页 > 其他分享 >[20241118]invalid date 0000-00-00(zero year)的输入.txt

[20241118]invalid date 0000-00-00(zero year)的输入.txt

时间:2024-11-18 21:42:07浏览次数:1  
标签:00 stats RAW 20241118 dbms raw RETURN 0000

[20241118]invalid date 0000-00-00(zero year)的输入.txt

--//昨天看了链接:https://www.anbob.com/archives/8511.html,类似的问题以前我也遇到过,我记忆里第一次在toad下,如果在浏
--//览数据模式,点击显示0000-00-00的grid会报错,提示invalid date。

--//我一直不明白这些日期输入如何输入的,在sqlplus下无法输入。最后只能认为一个程序OCI接受这些输入。
--//不过作者提供在sqlplu输入的方式,测试看看。

1.环境:
SCOTT@book01p> @ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.测试:
SCOTT@book01p> create table test2(ct date);
Table created.

SCOTT@book01p> insert into test2 values (0);
insert into test2 values (0)
                          *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER

SCOTT@book01p> insert into test2 values(to_date('00000000','yyyymmdd'));
insert into test2 values(to_date('00000000','yyyymmdd'))
                                 *
ERROR at line 1:
ORA-01843: not a valid month

SCOTT@book01p> select to_date('0000-00-00','yyyy-mm-dd');
select to_date('0000-00-00','yyyy-mm-dd')
                                        *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

--//与我以前测试类似,sqlplus下无法插入0000-00-00日期。

--//按照日期的转换格式计算RAW换算方法,'0000-00-00 00:00:00'拼接RAW 后是100,100,0,0,1,1,1, 转换为16进制是64640000010101。

WITH
    FUNCTION display_raw(rawval RAW, type VARCHAR2)
    RETURN VARCHAR2
    IS
        cn  NUMBER;
        cv  VARCHAR2(128);
        cd  DATE;
        cnv NVARCHAR2(128);
        cr  ROWID;
        cc  CHAR(128);
    BEGIN
        IF (type = 'NUMBER') THEN
            dbms_stats.convert_raw_value(rawval, cn);
            RETURN to_char(cn);
        ELSIF (type = 'VARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cv);
            RETURN to_char(cv);
        ELSIF (type = 'DATE') THEN
            dbms_stats.convert_raw_value(rawval, cd);
            RETURN to_char(cd);
        ELSIF (type = 'NVARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cnv);
            RETURN to_char(cnv);
        ELSIF (type = 'ROWID') THEN
            dbms_stats.convert_raw_value(rawval, cr);
            RETURN to_char(cr);
        ELSIF (type = 'VARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cc);
            RETURN to_char(cc);
        ELSE
            RETURN 'UNKNOWN DATATYPE';
        END IF;
    END;
select display_raw('64640000010101','DATE') x from dual;
/

X
------------------------------
0000-00-00 00:00:00

WITH
    FUNCTION display_raw(rawval RAW, type VARCHAR2)
    RETURN VARCHAR2
    IS
        cn  NUMBER;
        cv  VARCHAR2(128);
        cd  DATE;
        cnv NVARCHAR2(128);
        cr  ROWID;
        cc  CHAR(128);
    BEGIN
        IF (type = 'NUMBER') THEN
            dbms_stats.convert_raw_value(rawval, cn);
            RETURN to_char(cn);
        ELSIF (type = 'VARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cv);
            RETURN to_char(cv);
        ELSIF (type = 'DATE') THEN
            dbms_stats.convert_raw_value(rawval, cd);
            RETURN to_char(cd);
        ELSIF (type = 'NVARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cnv);
            RETURN to_char(cnv);
        ELSIF (type = 'ROWID') THEN
            dbms_stats.convert_raw_value(rawval, cr);
            RETURN to_char(cr);
        ELSIF (type = 'VARCHAR2') THEN
            dbms_stats.convert_raw_value(rawval, cc);
            RETURN to_char(cc);
        ELSE
            RETURN 'UNKNOWN DATATYPE';
        END IF;
    END;
insert into test2 select display_raw('64640000010101','DATE') x from dual;
/

insert into test2 select display_raw('64640000010101','DATE') x from dual
*
ERROR at line 34:
ORA-00928: missing SELECT keyword
--//oracle不支持这样写法,不知道写错在哪里。

create or replace function stats_raw_to_date (p_in raw) return date is
  v_date date;
  v_char varchar2(25);
begin
  dbms_stats.CONVERT_RAW_VALUE(p_in, v_date);
  return v_date;
exception
  when others then return null;
end;
/


SCOTT@book01p> insert into test2  select stats_raw_to_date('64640000010101') x from dual;
1 row created.

SCOTT@book01p> commit ;
Commit complete.

SCOTT@book01p> select * from test2;
CT
-------------------
2024-11-18 09:58:22
0000-00-00 00:00:00

--//21c也提供dbms_stats.CONVERT_RAW_TO_DATE函数。
SCOTT@book01p> @ desc_proc sys dbms_stats CONVERT_RAW_to_%
INPUT OWNER PACKAGE_NAME OBJECT_NAME
sample : @desc_proc sys dbms_stats gather_%_stats
OWNER      PACKAGE_NAME OBJECT_NAME                      SEQUENCE ARGUMENT_NAME DATA_TYPE     IN_OUT    DEFAULTED
---------- ------------ ------------------------------ ---------- ------------- ------------- --------- ----------
SYS        DBMS_STATS   CONVERT_RAW_TO_VARCHAR2                 1               VARCHAR2      OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_DATE                     1               DATE          OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_NUMBER                   1               NUMBER        OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_BIN_FLOAT                1               BINARY_FLOAT  OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_BIN_DOUBLE               1               BINARY_DOUBLE OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_NVARCHAR                 1               NVARCHAR2     OUT       N
                                                                2 RAWVAL        RAW           IN        N

                        CONVERT_RAW_TO_ROWID                    1               ROWID         OUT       N
                                                                2 RAWVAL        RAW           IN        N
14 rows selected.
--//有了这些函数方便多了,以前11g版本仅仅有dbms_stats.convert_raw_value,而且返回值保存在第2个参数里面。
--//于是才有了上面的函数display_raw。

SCOTT@book01p> select dbms_stats.CONVERT_RAW_TO_DATE('64640000010101') from dual ;
DBMS_STATS.CONVERT_
-------------------
0000-00-00 00:00:00

SCOTT@book01p> insert into test2 select dbms_stats.CONVERT_RAW_TO_DATE('64640000010101') from dual ;
1 row created.

SCOTT@book01p> commit ;
Commit complete.

SCOTT@book01p> select * from test2 where ct=dbms_stats.CONVERT_RAW_TO_DATE('64640000010101');
CT
-------------------
0000-00-00 00:00:00
0000-00-00 00:00:00
--//顺便提一下目前的toad 12.7版本,显示的是 0001/1/1.

select dump(ct,16) c10 ,test2.* from test2
C10                              CT                   
-------------------------------- ---------------------
Typ=12 Len=7: 78,7c,b,12,a,3b,17 2024-11-18 09:58:22  
Typ=12 Len=7: 64,64,0,0,1,1,1    0001-01-01 00:00:00  
Typ=12 Len=7: 64,64,0,0,1,1,1    0001-01-01 00:00:00  
已选择 3 行。

标签:00,stats,RAW,20241118,dbms,raw,RETURN,0000
From: https://www.cnblogs.com/lfree/p/18553742

相关文章

  • [20241118]NLS_LANG设置问题2.txt
    [20241118]NLS_LANG设置问题2.txt--//链接https://www.itpub.net/thread-2155589-1-1.html上的讨论。--//PiscesCanon指出:--//NLS_LANG设置错了,如果你的客户端是sqlplus,那么应该是NLS_LANG=.AL32UTF8或者NLS_LANG=AMERICAN_AMERICA.AL32UTF8,跟着--//OS的字符集来。另外,SecureCRT......
  • 500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机
    作为一名拥有十几年从业经验的科技爱好者,我主要想告诉大家一些关于骨传导耳机的知识。其中,要远离所谓的不专业产品,它们的佩戴不适和音质不佳问题高得吓人,尤其是很多宣称能提供舒适佩戴和高音质的产品,超过九成的用户都吐槽说它们会带来不适!对此,为了避免大家踩坑,我汇总了59款产品......
  • 100个Python精选库【建议收藏】
    Python为啥这么火,这么多人学,就是因为简单好学,功能强大,整个社区非常活跃,资料很多。而且这语言涉及了方方面面,比如自动化测试,运维,爬虫,数据分析,机器学习,金融领域,后端开发,云计算,游戏开发都有涉及。大概列了一下整个Python库的应用的方法面面,粗略算算就有20几个方向。左右两边分......
  • 打卡信奥刷题(262)用C++信奥P2004[普及组/提高] 领地选择
    领地选择题目描述作为在虚拟世界里统帅千军万马的领袖,小Z认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小Z来说是非常重要的。首都被认为是一个占地C×......
  • 从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望
    作者:金峰(项良)、朱永林、赵世振(寰奕)公司简介杭州热联集团股份有限公司成立于1997年10月,是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务,业务品种涵盖钢铁原料、钢铁产品及以铜为主的有色金属等。2023年,热联集团实现销售总......
  • 寻找 2300 名编程青铜一起写代码,学会就送包!
    编程不仅仅是技术的积累,更是一种思维方式的转变。身边越来越多朋友已经意识到,学会一门编程语言,就好像掌握了新的国际通用语言,享受学习交流世界最前沿知识、思想的快乐。但你是不是也一样,每次下定决心学编程,结果一看到密密麻麻的代码,立刻失去斗志。其实有了通义灵码这样的编程助手......
  • 寻找 2300 名编程青铜一起写代码,学会就送包!
    编程不仅仅是技术的积累,更是一种思维方式的转变。身边越来越多朋友已经意识到,学会一门编程语言,就好像掌握了新的国际通用语言,享受学习交流世界最前沿知识、思想的快乐。但你是不是也一样,每次下定决心学编程,结果一看到密密麻麻的代码,立刻失去斗志。其实有了通义灵码这样的编程助手......
  • 算力100问☞第7问:为什么要关注算力规模?
    算力规模的重要性不言而喻,它就像是衡量一个国家或企业在信息技术领域实力的“肌肉”。想象一下,算力就像是支撑起人工智能、大数据和高性能计算这些高科技的“骨骼”。随着信息量的爆炸式增长,我们对算力的需求就像对手机流量一样,总是觉得不够用。强大的算力就像是数字经济的“发......
  • 高效处理日均5000亿+数据:58集团基于Apache SeaTunnel的数据集成平台架构优化
    视频链接:58集团大数据平台基于ApacheSeaTunnel的架构演进https://www.bilibili.com/video/BV19GUPYcEgB/?vd_source=e139ecc995ab936267a7991b9de55f6c引言在数字化时代,数据已成为企业最宝贵的资产之一。58集团作为中国领先的生活服务平台,其大数据部在数据集成平台的建设上不......
  • 100 款支持 .NET 多版本的强大 WPF 控件库
    前言推荐一款集成了超过100款控件的流行XAML控件库,同时提供了一系列常用的.NET帮助类-CookPopularUI。它可以简化开发流程,让我们能够更加专注于核心业务逻辑的实现。让我们一起学习如何使用CookPopularUI,并详细了解其提供的丰富控件内容。项目介绍CookPopularUI不仅提供......