在分隔符处分割长 SQL 表达式

在分隔符处分割长 SQL 表达式

语境

我正在尝试使用 SQL*Plus 导入包含一些长行(8k+ 字符)的转储,因此我面临错误SP2-0027: Input is too long (> 2499 characters)。这是一个硬编码限制,无法克服。

预期解决方案

我想在 bash 中流式传输输入,并在最后一个,(逗号)字符上分割比预期宽度长的行。

所以我应该有类似的东西

cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe

细节

  1. 我知道较新的版本可以接受最多 4999 个字符的行,但我的行仍然更长 ( grep '.\{5000\}' my_dump.sql | wc -l)
  2. 手动更新转储实际上不太可行
  3. 我确实尝试过使用,tr但这分割了我不想要的每一行
  4. 我确实尝试使用fmtandfold但似乎不可能使用自定义分隔符
  5. 我目前正在查看,sed但我似乎无法找出一个正则表达式“,如果字符超过 2500 个,则在前 2500 个字符中查找最后一个匹配项”

答案1

尝试类似的方法:

sed -re '/.{2500}/ s/.{,2500},/&\n/g'

解释:

  • /.{2500}/如果行包含 2500 个字符(或更多)...
  • s/.{,2500},/&\n/g替换最多 2500 个字符,然后,添加换行符

如果这取代了一些不可替代的“,”,我不会感到惊讶......

答案2

我想像这样的 awk 命令会起作用:

awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'

正则表达式允许逗号前最多包含 2498 个字符(因此包括逗号在内为 2499 个字符),并在其后插入换行符。 (我使用了 2499,因为错误消息提到了该数字。)

相关内容