如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

2023-12-02

我面临一个奇怪的问题

我正在尝试将一些数字转换为“单词”,只需这样做:

TO_CHAR(TO_TIMESTAMP(LPAD( nvl(trunc(99999999),0) , 9, '0'), 'FF9'),'FFSP')      AS amt_in_words

效果很好,输出是 “九千九百万九百九十九千九百九十九”

但是当我们尝试输入像 99999998 这样的数字时会发生什么?

TO_CHAR(TO_TIMESTAMP(LPAD( nvl(trunc(99999998),0) , 9, '0'), 'FF9'),'FFSP')      AS amt_in_words

它抛出错误“ORA-01877:字符串对于内部缓冲区来说太长”

好吧,这是一个较小的数字,它应该可以工作,但事实并非如此 我的理论是:它失败了,因为结果文本的长度是79个字符,并且由于某种原因失败了

建议1:使用强制转换(EXPR as VARCHAR(100) ) 但它给出了同样的错误

有任何想法吗?

澄清: 不幸的是,我正在研究 Oracle Fusion BI buplisher,似乎我不能使用任何 Pl/sql 过程,只能使用普通的选择查询


PL/SQL 似乎不会遇到同样的问题,因此您可以编写自己的函数来进行转换:

create or replace function spell_number(p_number number) return varchar2 is
  l_str varchar2(200);
begin
  l_str := to_char(to_timestamp(lpad(nvl(trunc(p_number), 0) , 9, '0'), 'FF9'), 'FFSP');
  return l_str;
end;
/

然后甚至更长的值也可以工作:

select spell_number(99999999) from dual;

AMT_IN_WORDS                                                                                       
----------------------------------------------------------------------------------------------------
NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE                      


select spell_number(99999998) from dual;

AMT_IN_WORDS                                                                                       
----------------------------------------------------------------------------------------------------
NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-EIGHT                     

select spell_number(999999999) from dual;

AMT_IN_WORDS                                                                                       
----------------------------------------------------------------------------------------------------
NINE HUNDRED NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE         

任何超过 9 位的数字都会忽略最低有效数字,但这似乎是 SP 格式的限制:

with t (num) as (
  select 99999998 from dual
  union all select 99999999 from dual
  union all select 999999999 from dual
  union all select 1000000000 from dual
  union all select 1000000001 from dual
  union all select 1000000010 from dual
  union all select 9999999999 from dual
  union all select 10000000000 from dual
  union all select 99999999999 from dual
  union all select 100000000000 from dual
)
select num, spell_number(num) as amt_in_words from t;

          NUM AMT_IN_WORDS                                                                                       
------------- ----------------------------------------------------------------------------------------------------
     99999998 NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-EIGHT                     
     99999999 NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE                      
    999999999 NINE HUNDRED NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE         
   1000000000 ONE HUNDRED  MILLION                                                                                
   1000000001 ONE HUNDRED  MILLION                                                                                
   1000000010 ONE HUNDRED  MILLION ONE                                                                            
   9999999999 NINE HUNDRED NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE         
  10000000000 ONE HUNDRED  MILLION                                                                                
  99999999999 NINE HUNDRED NINETY-NINE MILLION NINE HUNDRED NINETY-NINE THOUSAND NINE HUNDRED NINETY-NINE         
 100000000000 ONE HUNDRED  MILLION                                                                                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877 的相关文章

  • 如何在存储过程中使用名称求和和分组?

    我想对钱列求和 但我想要状态中的组名称和代码 这是存储过程代码 Sql Server 2008 SELECT um upmoney as money um pId as code um FName as name up status as
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • SQL注入方法

    注射程序是 SELECT UserId Name Password FROM Users WHERE UserId 105 or 1 1 但是 我的问题是注入查询在 sql 中是如何工作的 当你在代码中将查询作为字符串时 就像这样 Quer
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • 如何使用 Alter Table 在 Access 中创建小数字段?

    我想以编程方式在 MS Access 表中创建一个新列 我尝试过很多排列ALTER TABLE MyTable Add MyField DECIMAL 9 4 NULL 并得到 字段定义中的语法错误 我可以轻松创建一个数字字段Double类
  • JbdcTemplate - 带有动态 SQL 查询的PreparedStatements

    I know jdbcTemplate可以用来创建PreparedStatements如果你这样设置 i e private JdbcTemplate jdbcTemplate String sqlQuery Select from tab
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • C# 查询两个数据库的数据

    我目前有一个查询 我正在从两个不同的数据库获取数据 这些数据被附加到一个名为 accountbuys 的列表中 我的第一个表有三个数据条目 3个想要购买股票的帐户 下一张表有 17 个数据点 购买 17 只股票 I am merging t
  • 与常规 SQL 查询不同,为什么“linq to sql”查询以 FROM 关键字开头?

    为什么 linq to sql 查询以FROM与常规 SQL 查询不同的关键字 LINQ 模仿Logical Query processing在 SQL 中你有 8 SELECT 9 DISTINCT 11 TOP 1 FROM 2 ON
  • 了解涉及 3 个或更多表时 JOIN 的工作原理。 [SQL]

    我想知道是否有人可以帮助我提高对 SQL 中 JOIN 的理解 如果它对问题很重要 我会特别考虑 MS SQL Server 取 3 个表 A B A 通过某些 A AId 与 B 相关 和 C B 通过某些 B BId 与 C 相关 如果
  • 使用显式值进行 BigQuery 合并

    据我所知 BigQuery 支持合并两个表 目前 INSERT操作允许将显式值插入表中 例如 INSERT dataset Inventory product quantity VALUES top load washer 10 front
  • 尚未为此带有 SQL Server 的 DbContext .NET Core 配置数据库提供程序

    我一直用这个把头撞在墙上 并且一直在谷歌上搜索无济于事 我刚刚开始一个新的 ASP NET Core MVC 项目 我已将这两个包安装 更新为 2 2 0 Microsoft EntityFrameworkCore SqlServer Mi
  • 创建和删除表空间 Oracle

    我已经创建了这个表空间 CREATE TABLESPACE IA643 TBS DATAFILE IA643 dat SIZE 500K AUTOEXTEND ON NEXT 300K MAXSIZE 100M 我尝试使用此命令删除它 DR
  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 独特的 Linux 文件名,可按时间排序

    以前我用的是uuidgen http man7 org linux man pages man1 uuidgen 1 html创建唯一的文件名 然后我需要通过 bash 脚本按日期 时间迭代该文件名 从那时起 我发现简单地通过 ls l 循
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可

随机推荐

  • 如何在Webview中自动输入密码

    我是 Java 和 Android 新手 我有一个问题 我认为解决方案可能很简单 但我无法解决 我创建了一个带有 WebView 的应用程序 我希望 WebView 自动输入用户名和密码 以便用户在启动应用程序时已经登录 我用谷歌搜索并找到
  • 如何配置 IIS 以使用自定义内容提供 404 响应?

    这个问题与this 希望措辞更好 我想从 ASP NET MVC 提供自定义 404 页面 我设置了路由处理程序和所有基础设施 以确保通过单个操作处理不存在的路由 public ActionResult Handle404 Response
  • 使用 Capybara/Selenium Webdriver 测试 HTML5 文件上传 - Ruby

    我有一个简单的模式 其中向用户显示浏览按钮以添加要上传的文件 由于一个未知的问题 无论是HTML5文件输入还是浏览器添加了自己的功能 这都成为测试的痛苦 在我的页面上有
  • 为什么一个简单的任务需要两个 SQL Server Service Broker 队列?

    我在网上找到的所有使用 SQL Server Service Broker 队列的示例似乎都有两个队列 我不明白为什么 每个例子似乎都假设这是显而易见的 没有必要解释 有几件事将写入我的队列 存储过程将从队列中读取并插入到数据库中 为什么我
  • 存储过程或 OR 映射器?

    哪个更好 或者使用 and OR 映射器与 SP 一起使用 如果您已经拥有带有 SP 的系统 那么 OR 映射器值得吗 我喜欢 ORM 因为你不必重新发明轮子 话虽如此 这完全取决于您的应用程序需求 开发风格和团队的风格 这个问题已经被覆盖
  • 在python中将UNIX时间戳转换为str并将str转换为UNIX时间戳[重复]

    这个问题在这里已经有答案了 例如 我想转换 UNIX 时间戳1385629728 to str 2013 11 28 17 08 48 并转换 str 2013 11 28 17 08 48 到 UNIX 时间戳1385629728 请按如
  • GDK - 防止实时卡上的屏幕变暗

    我发布了一张高频实时卡片 我希望在用户查看该卡片时防止屏幕变暗 我意识到这是一个与此重复的问题 适用于 Google Glass 的 GDK APK 防止屏幕变暗 但答案似乎不再有效 示例项目也不再保留在屏幕上 我也尝试过获取唤醒锁但没有成
  • ADO.NET 的 SqlCommand.CommandTimeout 如何工作?

    考虑一个存储过程 它在不使用事务的情况下大约在 60 秒内更新一些行 我们设置ADO NET的SqlCommand 超时至 30 秒 SqlCommand Timeout 30 当超时发生在 30 秒时 存储过程是否会继续在数据库服务器中运
  • 启动一个完全独立于Python的进程

    我正在尝试从 python 启动一个完全独立的进程 我不能使用像这样简单的东西os startfile因为我需要传递参数 目前我正在使用subprocess popen这让我完成了 90 的任务 args some exe exe some
  • MPMovies PlayerViewController 进入背景时变黑

    我的 MPMoviePlayerViewController 有问题 当应用程序进入后台然后我再次启动它或转到另一个 viewControllers 时 电影变黑了 我有在菜单背景中播放的电影 这是我的代码 编辑代码 void viewDi
  • 页面刷新后保留下拉列表的选定值

    我有一个按钮可以根据多个下拉值中的选择来过滤列表 但是 我遇到了一个问题 一旦单击按钮 页面就会刷新 并且下拉值将重置为默认值 如何确保刷新后所选值保留在下拉列表中 div div
  • 隐含的路径归纳

    这是一个后续问题在 Agda 中进行路径归纳 我想知道什么时候这个结构可能更具表现力 在我看来 我们总是可以这样表达 f forall A gt x y A gt x y gt some type f refl instance of so
  • MySQL:获取父子结构的根节点

    我有一个与此类似的表 Id ParentId 1 0 2 1 3 0 4 3 5 3 6 0 7 6 8 7 给定一
  • 如何使用 C# Parallel.For 实现 OpenMP 多级代码

    如何使用 C Parallel For 在以下 OpenMP 代码中实现 OpenMP 代码 pragma omp parallel float data new float 1000 pragma omp for for int i 0
  • 即使未注册,也会在 WooCommerce 感谢页面上显示客户详细信息

    在 WooCommerce 中 对于登录用户 感谢 已收到订单 页面确实会显示客户详细信息 例如姓名 地址和电子邮件 但是当客户未注册时什么也没有 如何确保非注册用户在支付成功后 能像注册用户一样在Thankyou 已下单 页面看到自己的详
  • 如何使用HtmlAgilityPack进行异步调用?

    我正在尝试获取带有 id 的表table matches可用的here 问题是表是使用加载的ajax所以我没有得到完整的html下载页面时的代码 string url http www oddsportal com matches socc
  • 如何使用 Firestore 数据库快照填充表日历

    我正在尝试填充要在 TableCalendar 上显示的事件地图 使用表日历包 要填写事件 我需要一个 Map 所以一开始我创建了这个 Map
  • VB.net 到 MySql 存储过程错误

    我是存储过程的新手 所以我可能会错过一些简单的东西 但我研究了基础知识 并且一直试图从 vb net 代码集成它 我创建了一个简单的存储过程 我认为 它只运行今天结果的数据查询 例行DDL 注意 例程主体前后的注释不会被服务器存储 DELI
  • 显示最后一个非空单元格的地址(如果值不唯一)

    我有以下 Excel 电子表格 A B C D E F 1 Jan Feb March April May 2 Profit 100 200 200 3 Cell Reference last non empty cell In Row 2
  • 如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

    我面临一个奇怪的问题 我正在尝试将一些数字转换为 单词 只需这样做 TO CHAR TO TIMESTAMP LPAD nvl trunc 99999999 0 9 0 FF9 FFSP AS amt in words 效果很好 输出是 九