【问题标题】:SELECT CONCAT in Oracle DB在 Oracle 数据库中选择 CONCAT
【发布时间】:2020-10-24 11:31:41
【问题描述】:

我正在使用 oracle 数据库,但我没有太多经验,以防我需要对我想在 sql 服务器上使用 CONCAT 的表列进行“备份”,但它适用于Oracle,不,它给出了错误 ORA-00909。 我正在使用的查询是:

SELECT Concat ( 'UPDATE HCAlerta SET descricao="', descricao, '" WHERE neoId=', neoid )
FROM   hcalerta --that would give me AS an answer
UPDATE hcalerta
SET    descricao = "Tarefa 000015 - Solicitar Vaga -  - Requisição de Pessoal."
WHERE  neoid = 1071178

【问题讨论】:

  • concat() 在 Oracle 中只接受两个参数。请改用||
  • 尝试了这种方式,但返回了同样的错误。 SELECT CONCAT('UPDATE HCAlerta SET descricao="'|| descricao || '" WHERE neoId=' || neoId) from HCAlerta
  • @Bruno - || 而不是 concat(),不在其中。你已经从四个参数变成了一个。
  • 返回了同样的错误。 Erro: ORA-00911: invalid character

标签: sql oracle concat


【解决方案1】:

Oracle 的concat() function 只接受两个参数。你可以嵌套调用,但这很麻烦:

CONCAT(CONCAT(CONCAT('UPDATE HCAlerta SET descricao="', descricao,), '" WHERE neoId='), neoId)

用户the concatenation operator更简单:

'UPDATE HCAlerta SET descricao="' || descricao || '" WHERE neoId=' || neoId

但是你的引用是错误的;双引号将标识符括起来,例如表或列名,而不是值;所以你需要单引号 - 但需要转义它们:

'UPDATE HCAlerta SET descricao=''' || descricao || ''' WHERE neoId=' || neoId

在您的查询中:

select'UPDATE HCAlerta SET descricao=''' || descricao || ''' WHERE neoId=' || neoId
from HCAlerta

db<>fiddle 演示(无法正确显示多字节字符;但这是该环境的问题,而不是查询...)。

您也可以使用alternative quoting mechanism,但在这种特殊情况下可能会更令人困惑。

很遗憾返回给我错误:ORA-00923: FROM 关键字未在预期的位置找到

如果您有一个 LONG 列,那么您可以使用 PL/SQL 块来处理它:

begin
  for r in (
    select neoId, descricao from HCAlerta
  )
  loop
    dbms_output.put_line('UPDATE HCAlerta SET descricao=''' || r.descricao || ''' WHERE neoId=' || r.neoId);
  end loop;
end;
/

...记得在您的客户端中启用输出(例如,SQL*Plus 中的set serveroutput on 等)。

db<>fiddle

获取表的完整副本并在必要时恢复它可能会更容易;或导出/导入等。

【讨论】:

  • 返回此错误ORA-00932: inconsistent datatypes: expected CHAR got LONG
  • descricao 是 LONG 数据类型吗?为什么你还在使用 LONG 而不是 CLOB?
  • 它是文本,但系统与创建的几个银行兼容,例如为 mysql 创建的 VARCHAR (8000) 字段,但 oracle 不允许大于 4000 的字段,所以我必须将此备份到将此列转换为 CLOB
  • 您使用的是哪个版本的 Oracle?从 12c 开始,您可以拥有更大的 varchar2 列。如果您正在做的是将 LONG 转换为 CLOB,那么制作整个表的副本可能会更简单。如果你还没有,也可以see this
  • 客户端使用的是 11g 版本,我通过提供一个选择列进行管理并将其保存在 txt 中,暂时可以使用,谢谢
【解决方案2】:

使用|| 运算符:

SELECT 'UPDATE HCAlerta SET descricao="' || descricao || '" WHERE neoId=' || neoId
FROM HCAlerta;

在 Oracle 中,CONCAT() 只接受两个参数。

如果您想要在两个数据库中都可以使用的版本,可以使用REPLACE()

SELECT REPLACE(REPLACE('UPDATE HCAlerta SET descricao="[descricao]" WHERE neoId=[neoId]',
                       '[neoId]', neoid
                      ), '[descricao]', descricao
              )
FROM HCAlerta;

【讨论】:

  • 很遗憾地回了我Error: ORA-00923: FROM keyword not found where expected
  • @BrunoMello 。 . .立即尝试。
  • 在替换版本中,descricao需要加引号-... SET descricao=''[descricao]'' WHERE ...,或者替换时添加;不知道 SQL Server 如何处理引号。第一个版本不包括表中的实际值 - 连接运算符不应该在该字符串中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多