问题标签 [ora-01722]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
32291 浏览

oracle - 使用 START WITH from Query 创建序列

如何创建我的 START WITH 值来自查询的序列?

我正在尝试这种方式: CREATE SEQUENCE "Seq" INCREMENT BY 1 START WITH (SELECT MAX("ID") FROM "Table");

但是,我收到 ORA-01722 错误

0 投票
3 回答
387 浏览

oracle - 除非 DBA,否则无法在 oracle 上连接

我刚刚创建了一个新用户,它确实有创建会话,但是每次我尝试在 PLSQL Developer 上连接时,我都会得到 ORA-00604、ORA-01722 和 ORA-06512

但是,如果我授予 DBA 访问权限,我可以毫无问题地登录。

提示?我没有任何连接触发器。

0 投票
2 回答
628 浏览

sql - to_number() 的另一个问题。我只是不明白

我有一个主表(以下称为 SURVEY)和一个详细表(以下称为 ANSWERS)。不出所料,ANSWERS 有 SURVEY 问题的答案。ANSWERS 有一个名为 TEXT 的 VARCHAR2 列。一些 ANSWERS.TEXT 值是真正的文本,但有些实际上是数字。幸运的是,我总是知道哪些行包含文本,哪些包含数字作为文本。

这是它的方式。我无法改变这一点。

过去,当某些 ANSWERS 行被保存时,它们的 TEXT 值被精心挑选并放入正确类型列中的 SURVEY 表中。一个简单的单表选择将获取 SURVEY 和特殊值。

但是现在,随着新应用程序的添加,我们删除了特殊列。相反,我们现在必须取而代之的是获取适当的 ANSWERS 行的 TEXT 值。

我创建了一个模拟旧的琐碎选择语句的查询。它工作得很好......主要是。

这是一个片段:

您可能会注意到 j2. 在实际查询中,有六个这样的列,j1 到 j6。当我运行查询时,它看起来就像旧查询一样。你不能说它真的是由主/细节组装而成的。那是一种解脱!

但是,我的问题是“overall_score > 70”短语会导致“1722 无效数字”错误。当我不包含该短语时,Oracle 就像蛤蜊一样高兴,因此所有输出都通过 j2 的 to_number() 函数并且看起来不错。但是如果我添加条件,我会失败。

where 子句的“overall_score”部分是根据从网页输入的搜索条件动态添加的。

我需要一些fu来告诉 Oracle 我真的知道我在做什么,请去做。如果有非数字数据,ok,让j2的to_number()失败。凉爽的。但除此之外,就去做吧。

有什么妙语吗?我是承包商,时间快到了。这是一个新要求:-/

0 投票
3 回答
12656 浏览

c# - 为什么我收到 ORA-01722(无效号码)?

我一直在使用参数化查询将值插入到 Oracle 表中,如下所示:

这一直工作正常,但突然停止工作,我收到 Oracle 错误 ORA-01722(无效号码)。我检查了参数,所有数字都是毫无疑问的有效数字。我什至用虚拟值替换了任何空值,但我仍然得到错误。我在直接 sql 中尝试了相同的查询(使用 OraDeveloper Studio),即使使用相同的参数,它也可以工作。

我如何追踪这个?

编辑:根据评论中的请求,这里是创建表语句:

0 投票
3 回答
16674 浏览

c# - Oracle 的 C# 参数化查询 - 严重且危险的错误!

这是绝对的咆哮。我不敢相信自己的眼睛,如果它是 C# 中的一个真正的错误,我也不敢相信在我之前没有人会发现这一点,所以我将它发布给开发人员社区的其他人,告诉我我做错了什么。我确信这个问题会让我说“DOH!” 并用我的手掌非常用力地敲打我的头-但是无论如何……

为了测试,我创建了一个表Test_1,脚本如下:

现在我执行以下代码:

哇!我收到 ORA-01722 错误 - “无效号码”!怎么了? Column1是数字,值为 1,这很好;Column2是一个字符串,并且Column3是一个可以为空的列,所以不应该造成任何麻烦......

现在坐下来听这个...这里的问题是Column3并且Column2按照它们添加到OracleParameterCollection. 切换它们,然后!有用!

当然,这将引导我进行下一个明显的实验......让我们更改该代码块以添加参数,如下所示:

你认为这会奏效吗?好吧,猜猜看 - 它确实如此

我坐在这里完全惊呆了。我无法相信我所看到的,我同样无法相信在我之前没有人发现这种行为(除非我不知道如何正确使用 Google)。

这不仅仅是一个烦恼 - 它是非常危险的。如果我转置了相同数据类型的两列会发生什么?我什至不会出错——我只是将错误的数据插入到错误的列中,而且一点也不聪明。

有没有人有任何解决方法的想法 - 除了小心不要以错误的顺序添加参数?

0 投票
8 回答
3825 浏览

sql - 您如何防止 Oracle 的基于成本的优化器进行糟糕的优化?

考虑以下场景。stupid_table我无法控制的架构中有一个表 (a )。它是第三方,不受限制。没有敏感。我可以查询它,但不能添加索引或新表或更改设计。

中的每一列stupid_table都是一个VARCHAR2(50 BYTE),有很多列,但我只需要其中两个:row_typemagic_number. magic_number填充了整数的字符串表示形式,但仅设置row_type'DATA'我只需要大于零的幻数。

这会导致“无效数字”Oracle 错误,因为基于成本的优化器 (CBO) 选择TO_NUMBER在检查之前评估row_type并且有一大堆具有不同row_type和不同用途的magic_number字段的行。

好的,如果我先过滤行,然后进行比较呢?

现在 CBO 似乎发现该查询非常简单,并且忽略了我使用的狡猾,产生了与原始查询计划相同的查询计划。

最后,无奈之下,我求助于肮脏的技巧:使用/*+RULE*/查询提示强制 Oracle 使用旧的基于规则的优化器。这就像一个梦想,但它不应该是必要的,更不用说它正在使用不再支持的 Oracle 功能。

有一个更好的方法吗?

0 投票
2 回答
1114 浏览

ruby-on-rails - Rails 3 和 Oracle:NLS 设置拒绝小数分隔符

我正在一个只读的 oracle 数据库(通过 oracle_enhanced_adapter 连接)上使用 Ruby on Rails 3.0。

遇到已知的“n+1 查询”问题,我尝试了包含方法。
与 Rails 指南中的描述不同,生成的第二个查询列出了所需的 id 不是整数,而是浮点值的字符串表示形式。原始 ID 的类型为 NUMBER。

不幸的是,数据库 NLS 设置是针对德国的,包括NLS_NUMERIC_CHARACTERS需要“,”作为小数分隔符的。所以我总是得到一个ORA-01722错误,如此处所述

更确切地说:

@var.assoc.includes(:another_assoc).where("column_1 = ?", some_value)

产量

ActiveRecord::StatementInvalid: OCIError: ORA-01722: invalid number: SELECT "TABLE_A".* FROM "TABLE_A" WHERE ("TABLE_A"."ID" IN ('1715.0','1716.0','1717.0','1718.0' ,'1719.0','1720.0','1721.0'))

(我不得不简化上面的 Rail 代码,因为它包含一些令人分心的细节,比如“字符串到符号”的转换)

如前所述,数据库是只读的,所以使用

直接在数据库上工作。但我无法找到改变 rails 会话的正确方法。

我发现的所有内容似乎都引用了 Rails 2 或使用了已弃用的函数。
我怎样才能为 Rails 3.0 解决这个问题?

或者:如何强制 Rails(或者 oracle_enhanced_adapter)将所有列出的 id 转换为 Fixnum?

谢谢和最好的问候,蒂姆

0 投票
1 回答
875 浏览

oracle - 错误 500:无法在休眠映射中初始化集合

我是 Hibernate 的新手。希望你们能帮我调试下面的错误,这真的让我抓狂。

我有一个名为 CONTENT_WORKGROUP 的表,它将映射到另一个名为 CONTENT_WORKGROUP_ROLE 的表。下面是表结构和示例数据:

CONTENT_WORKGROUP

  1. CM_WORKGROUP_ID NUMBER(15,0)
  2. WORKGROUP_ID NUMBER(15,0)
  3. ROLE_ID VARCHAR2(20 BYTE)

CONTENT_WORKGROUP_ROLE

  1. CM_WORKGROUP_ROLE_ID NUMBER(15,0)
  2. ROLE_ID VARCHAR2(20 BYTE)
  3. FUNCTION_ID VARCHAR2(40 字节)

P/S:一个用户工作组可以有多个角色(创建者、管理员、审批者)。该工作组可以执行的功能(添加、编辑、删除)可以从 CONTENT_WORKGROUP_ROLE 中查询。

样本数据:

CONTENT_WORKGROUP

CM_WORKGROUP_ID WORKGROUP_ID ROLE_ID
1 136 创建者
2 137 管理员
3 136 管理员

CONTENT_WORKGROUP_ROLE

CM_WORKGROUP_ROLE_ID ROLE_ID FUNCTION_ID

1 创建者复制
2 创建者编辑
3 创建者删除
4 创建者添加
5 管理员编辑
6 管理员批准
7 管理员拒绝

但是,当我获得特定工作组持有的 ContentWorkgroupRole 的 SET 时出现错误。

[11/23/10 15:28:56:053 SGT] 00000039 SystemOut O [23/11/2010 15:28:56.053] 错误 JDBCExceptionReporter - ORA-01722:无效数字

[11/23/10 15:28:56:100 SGT] 00000039 ServletWrappe E SRVE0068E:在 servlet 的服务方法之一中抛出未捕获的异常:操作。抛出异常:javax.servlet.ServletException:无法初始化集合:[corp.celcom.next.infochannel.model.ContentWorkgroup.contentWorkgroupRole#1]

下面是我的休眠映射文件:ContentWorkgroup.hbm.xml

CM_WORKGROUP CM_WORKGROUP_ID

内容工作组角色.hbm.xml

CM_WORKGROUP_ROLE_ID CM_WORKGROUP_ROLE

在我的 ACTION 类中,上述错误发生在这一行: Iterator iter = cw.getContentWorkgroupRole().iterator();

for(ContentWorkgroup cw : contentWorkgroupList) { Iterator iter = cw.getContentWorkgroupRole().iterator();

myForm.setAllowAdd(true); if (role.getFunctionId().equalsIgnoreCase(Constant.EDIT)) myForm.setAllowEdit(true); if (role.getFunctionId().equalsIgnoreCase(Constant.DELETE)) myForm.setAllowDelete(true); } }

奇怪的是,当我将 ROLE_ID 更改为 Integer/Long(即 1-Creator,2-Administrator)而不是使用 String 时,它工作正常!我不明白为什么以及我的代码有什么问题。

谢谢你的帮助。我已经花了 1 天时间来处理这个错误。谢谢!

0 投票
9 回答
74759 浏览

oracle - “安全”TO_NUMBER()

这显然给了我一个例外:

ORA-01722: 无效号码

有没有办法“跳过”它并获取0NULL代替?

整个问题:我有NVARCHAR2字段,其中包含数字而不是几乎 ;-) (如*),我需要从列中选择最大的数字。

是的,我知道这是一个糟糕的设计,但这就是我现在需要的...... :-S

更新

对于我自己,我已经解决了这个问题

0 投票
1 回答
27730 浏览

java - .nextval JDBC 插入问题

我尝试以序列 .nextval 作为主键插入表中,Java 中的 sql 是

但是,错误是ORA-01722: invalid number

其他字段都是正确的,我认为是顺序的问题,这是正确的吗?