首页 > 其他分享 >查字符类型转换date类型值时报错“ORA-00904: "GET_INTERNAL_VALUE": invalid identifier”

查字符类型转换date类型值时报错“ORA-00904: "GET_INTERNAL_VALUE": invalid identifier”

时间:2023-07-08 20:32:55浏览次数:42  
标签:类型转换 END temp get -- GET value VALUE RETURN

问题描述:查字符类型转换date类型值时报错“ORA-00904: "GET_INTERNAL_VALUE": invalid identifier”,如下所示:
数据库:oracle 11.2.0.4
1、异常重现
SYS@orcl> select get_internal_value('DF2304290000748902') from dual;
select get_internal_value('DF2304290000748902') from dual
       *
ERROR at line 1:
ORA-00904: "GET_INTERNAL_VALUE": invalid identifier
2、解决过程
SYS@orcl> CREATE OR REPLACE FUNCTION get_internal_value(p_value IN VARCHAR2)
  RETURN VARCHAR2 IS
  FOR i IN 1 .. 15 LOOP
  temp_n NUMBER := 0;
              ASCII(SUBSTR(RPAD(p_value, 15, CHR(0)), i, 1));
BEGIN
  RETURN TO_CHAR(ROUND(temp_n, -21));
  FOR i IN 1 .. 15 LOOP
  WHEN OTHERS THEN
    temp_n := temp_n + POWER(256, 15 - i) *
END get_internal_value;
              ASCII(SUBSTR(RPAD(p_value, 15, CHR(0)), i, 1));
  END LOOP;
  RETURN TO_CHAR(ROUND(temp_n, -21));
EXCEPTION
  WHEN OTHERS THEN
    RETURN p_value;
END get_internal_value;
 14  /

Function created.

SYS@orcl> select get_internal_value('DF2304290000748902') from dual;

GET_INTERNAL_VALUE('DF2304290000748902')
----------------------------------------------------------------------
354499932302760000000000000000000000

3、拓展知识
--创建get_external_value函数.
CREATE OR REPLACE FUNCTION get_external_value(p_value IN VARCHAR2)
  RETURN VARCHAR2 IS
  temp_n    NUMBER;
  temp_i    INTEGER;
  my_result VARCHAR2(32767) := NULL;
BEGIN
  IF LENGTH(p_value) <> 36 OR
     SUBSTR(p_value, 16) <> '000000000000000000000' OR
     p_value > POWER(256, 15) OR p_value < POWER(256, 14) THEN
    RETURN p_value; -- cannot get external value
  END IF;
  temp_n := p_value / POWER(256, 14); -- get most significant digits
  -- decoding most significant digits then shift multiplying by 256
  FOR i IN 1 .. 14 LOOP
    temp_i := TRUNC(temp_n);
    temp_n := (temp_n - temp_i) * 256;
    IF temp_i NOT BETWEEN 32 AND 126 OR temp_n NOT BETWEEN 32 AND 126 THEN
      EXIT; -- reached the tail
    END IF;
    my_result := my_result || CHR(temp_i); -- all but last byte
  END LOOP;
  IF temp_i NOT BETWEEN 32 AND 126 THEN
    RETURN my_result || '?'; -- cannot decode
  END IF;
  -- scan to the right starting at temp_i
  FOR i IN temp_i .. 126 LOOP
    IF get_internal_value(my_result || CHR(i)) = p_value THEN
      RETURN my_result || CHR(i); -- approximate value
    END IF;
  END LOOP;
  -- scan to the left starting at temp_i
  FOR i IN 32 .. temp_i LOOP
    IF get_internal_value(my_result || CHR(temp_i + 32 - i)) = p_value THEN
      RETURN my_result || CHR(temp_i + 32 - i); -- approximate value
    END IF;
  END LOOP;
  RETURN my_result || CHR(temp_i); -- this is the best we could do
EXCEPTION
  WHEN OTHERS THEN
    RETURN p_value;
END get_external_value;
/

SYS@orcl> select get_internal_value('2022-05-31') a,get_internal_value('2022-06-02') b from dual

A                                                B
---------------------------------------- ----------------------------------------
260592375524722000000000000000000000     260592375524722000000000000000000000

注意:对于varchar2类型的字段保留日期记录,跨月查询可能会导致执行计划异常.
参考网址:https://blog.51cto.com/hunt1574/5462623

标签:类型转换,END,temp,get,--,GET,value,VALUE,RETURN
From: https://blog.51cto.com/u_12991611/6663008

相关文章

  • 用容器部署Nexus 3作为Nuget和Docker的仓库
    1、准备docker-compose的配置文件version:'3'services:nexus:image:'sonatype/nexus3:3.42.0'container_name:nexusrestart:alwayshostname:nuget.dudusoft.cnprivileged:trueenvironment:-TZ=Asia/Shanghai......
  • error NU1803: 错误形式的警告: 正在通过 “HTTP” 源“http://apricot.com/repositor
    一、私有仓库错误(vs2022)错误信息errorNU1803:错误形式的警告:正在通过“HTTP”源“http://apricot.com/repository/nuget-group/”运行“restore”操作。将来的版本中将删除非HTTPS访问权限。请考虑迁移到“HTTPS”源。错误截图二、解决&处理打开Nuget配置%APP......
  • R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据|
    全文链接:http://tecdat.cn/?p=24492最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。此分析的目的是构建一个过程,以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括1258天的股票收益介......
  • 深度剖析之由浅入深揭秘JavaScript类型转换(最全总结篇)
    前言系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。深度剖析之由浅入深揭秘JavaScript类型转换(最全总结篇)值类型转换将值从一种类型转换为另一种类型通常称为类型转换,分为隐式强制类型转换和显示强制类型转换。两者的区别在于......
  • ,软件运行监听地址 ,扫码登录,爬虫介绍,requests模块介绍和快速使用,get请求携带参数,编码
    补充#软件运行,监听地址127.0.0.1 只能访问127.0.0.1localhost不能用本机ip地址访问,外部所有人都不能访问你0.0.0.0 127.0.0.1localhost本机ip地址访问同一个局域网内,都可以通过ip地址访问#本地host解析 输入网址---》www.baidu.com---->找本地host文......
  • go get 和 go install 对比
    (一)命令定义和区别goinstall和goget都是Go语言的工具命令,但它们之间有一些区别。goget:用于从远程代码存储库(如GitHub)中下载或更新Go代码包。它会下载代码包并将其存储在$GOPATH/src目录下对应的位置,并编译代码包中的程序和库。如果目标包之前已经被下载过了,那么g......
  • get方法怎么传json
     1.get方法是一种常用的HTTP请求方法,它能够将数据请求从客户端发送到服务器。而传递JSON数据则可以在请求和响应之间以更复杂的方式传递数据。下面我们来看一下如何用get方法传送JSON数据。vardata={name:'Alice',age:18,email:'[email protected]'}varurl='ht......
  • 华为超算平台git、cmake、wget、curl报错:SSLv3_client_method version OPENSSL_1_1_0
    最近在使用超算平台时报错,不管是git、cmake、wget、curl中的哪个都报错,大致错误: /usr/bin/cmake3:relocationerror:/usr/lib64/libcurl.so.4:symbolSSLv3_client_methodversionOPENSSL_1_1_0notdefinedinfilelibssl.so.1.1withlinktimereference  参考网......
  • 活动开启 | 以梦筑码 · 不负韶华 开发者故事征集令,讲出你的故事,有机会参加HDC.Togeth
     HarmonyOS面世以来,经历了3大版本迭代,系统能力逐步完善,生态加速繁荣。一路前行,是开发者们点亮漫天星光。点滴贡献,聚沙成塔,开发者们正用代码改变世界。是梦想,激励我们一路前行。在黎明到来前,有人在迷雾中启程,有人在坎坷中奔跑,有人在未知中探索,有人在困境中坚持,有人在挫折里涅......
  • java中的类型转换
    类型转换自动类型转换表达式自动类型转换强制类型转换 自动类型转换类型范围小的变量,可以直接赋值给类型范围大的变量。bytea=12;intb=a;System.out.println(b);//12 ......