首页 > 解决方案 > 更改参考数据库表的输入值

问题描述

它有点复杂,但我试图解释它..我在数据库中有一个表,看起来像这样。这是partno表

 ... |   Part No     | Convert | ...
 ... |    00000      |  ABC    | ...
 ... |    00001      |  DEF    | ...

所有输入值必须以 00000 或 00001 开头,例如 = 0000012345、000014321。

然后,基于这前 5 个值(00000 和 00001),它将被转换为像转换列一样。

例子:

输入:0000012345
预期:ABC12345

输入:000014321
预期:DEF4321

这意味着我必须根据上表转换我得到的输入,但我不知道该怎么做。所以,我作弊并像这样进行查询:

Insert into pencil (pencil_no,lastdate) 
values('ABC'|| SUBSTR('" + pen + "',1,2), sysdate)

//pen is the input value

它在我得到我想要的输出时起作用。但不幸的是,这不是正确的方法,因为表中的数据会更新和更改。

谁能指导我如何做到这一点?提前致谢

更新:我遵循以下答案中的指南,如下所示:

insert into pencil(pencil_no, lastdate)
select c.convert || substr('"+ pen + "', 22, 11), sysdate
from partnotable c
where c.PART_NO = substr('" + pen + "', 1, 15)

我设法将它插入到我的数据库中。不幸的是,有一个错误,即试图插入重复键的 UPDATE 或 INSERT 语句。对于在 DBMS MAC 模式下配置的 Trusted Oracle,如果在不同级别存在重复条目,您可能会看到此消息。我相信我输入的输入与表中的任何数据都不重复。当我运行查询时,插入了一行,我可以在我的数据库中查看它,但是当我运行程序时,输出不显示。

我尝试通过添加增量来遵循此方法http://www.lifeaftercoffee.com/2006/02/17/how-to-create-auto-increment-columns-in-oracle/但仍然失败。

标签: sqldatabaseoraclesql-insert

解决方案


您的插入语句需要包含转换表的查找,我将在插图中将其称为 CONVERT_TABLE。

您需要引用输入值两次,一次用于查找,一次用于插入值。我在这里使用 SQL*Plus 替换变量;您将需要调整语法以适应您正在运行的 SQL。您还需要使用正确的连接运算符,这在 Oracle 中||不是+.

insert into pencil (pencil_no,lastdate) 
select c.convert || substr('&&input_value',6), sysdate
from convert_table c
where c.part_no =  substr('&&input_value',1, 5)

这是一个糟糕的数据模型。一列代表两件事,在这种情况下,一个 PART_NO 和一个(?)序列号违反了第一范式。结果是棘手的 SQL,通常在从表中选择时,有时在插入或更新时就像这里一样。正确的模型将为表中的每个键组成部分定义单独的列,并使用复合主键或唯一键。如果您需要 PENCIL 列的串联版本,您可以使用虚拟列在查询中显示它


推荐阅读