(一)问题提出:
不知道大家有没有遇到过这样的情况,同样的sql在pl/sql下面执行正常,但是拷贝到表字段中,点击提交的时候老是会报ORA-01480: STR 绑定值的结尾 Null错误,如图:
这时候去掉几行在提交又可以,加上一行就报错。
(二)问题分析
上面的错误很有可能是字符串太长了,可能你会说,不会啊,我就几行sql,我的字段长度是3000的,怎么可能超长呢?,事实上发生这种情况的sql大部分经过sql美化处理,里面含有大量的空格。
直接上例子,如图:
很普通的sql,看起来字符很少,但是里面有很多空格,直接使用16进制工具查看更明显。
里面的20对应十进制就是32,对应ascii就是空格。如图:
所以看起来字符串很少,但是加上大量的空格很容易超过字段的最大长度。
(三)问题处理方法
既然有空格,我把多余的空格去掉不就可以了吗?
很正确的做法,如何去掉多余的空格呢?
经过美化的sql不仅含有空格,还有很多换行字符,oracle使用chr(10),也就是ascii的10来表示换行。
处理思路是:想把chr(10)换成空格' ',然后使用正则把多余的空格替换为一个空格。我也不卖关子了,直接上sql。
select id, v_text, length(v_text) src_len, regexp_replace(replace(v_text, chr(10), ' '), '\s{2,}', ' ') pro_str, length(regexp_replace(replace(v_text, chr(10), ' '), '\s{2,}', ' ')) pro_len from t_blob_test
处理结果为:
(四)问题处理方法续
反应快的朋友可能回想,你上面写的毫无意义,你能保存,那证明上面的没有超过字符串的最大长度,我遇到的问题是保存不了,那怎么做呢?
方法是一样的,去掉多余空格。
步骤如下:
(一)把sql中的'''换成双引号,可以使用pl/sql的Ctrl+F完成。
(二)构建临时结果,直接替换空格
在sql前面加上'select ,sql后面加上from dual,注意去掉sql最后的;,使用with直接查询,如下所示,把下面的abc abc替换成前面的sql字符串(单引号全部替换为双引号之后的结果)就可以了:
with tmp_t as( select 'select abc abc from dual' as content from dual) select length(content) src_len, regexp_replace(replace(content, chr(10), ' '), '\s{2,}', ' ') pro_str, length(regexp_replace(replace(content, chr(10), ' '), '\s{2,}', ' ')) pro_len from tmp_t
结果如下:
上面的proc_str就是去掉多余空格的结果了。
更简单的sql为:
select regexp_replace(replace(q'[&1]', chr(10), ' '), '\s{2,}', ' ') from dual
对Java熟悉的朋友可以使用代码直接替换:
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class 去掉多余回车空格 { public static void main(String[] args) { String fileName = "F:/saveFile/temp/测试sql2.sql"; processSqlFile(fileName); } public static void processSqlFile(String fileName) { try { FileReader rFile = new FileReader(fileName); BufferedReader br2 = new BufferedReader(rFile); StringBuffer context = new StringBuffer(); String str = null; while ((str = br2.readLine()) != null) { context.append(str).append("\n"); } str = context.toString(); str = str.replaceAll("\\n", " ");//去掉换行 str = str.replaceAll("\\s{2,}", " ");//去掉多余的空格 FileWriter wFile = new FileWriter(fileName); wFile.write(str); System.out.println("修改成功"); rFile.close(); br2.close(); wFile.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
题外话:
感谢各位厚爱,本人博客从原来的3333次访问短短一个月达到了11000次访问,在此谢谢各位了。
本文系原创,转载请注明出处。谢谢。
全文完。
相关推荐
Oracle Sql 中常用字符串处理函数 Oracle Sql 中提供了多种字符串处理函数,用于对字符串进行各种操作,如大小写转换、截取、连接、查找、替换等。下面是 Oracle Sql 中常用的字符串处理函数: 1. 大小写转换函数 ...
在Oracle数据库中,将字符串转换为数字是一项常见的操作,特别是在处理包含数字的字符串列时,可能需要进行数值计算或按照数值大小进行排序。本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标...
C#连接Oracle数据库字符串 C#连接Oracle数据库字符串
在Oracle数据库中,处理字符串是常见的操作之一,尤其是在数据分析或数据清洗的过程中。有时我们需要将一个长字符串分割成多个部分,以便进行进一步的操作。Oracle提供了一些内置的函数来帮助我们完成这个任务。本篇...
Oracle 连接字符串是指连接 Oracle 数据库的字符串书写方法,本文总结了多种连接 Oracle 数据库的字符串书写方法。 一、标准连接字符串 标准连接字符串是最基本的连接字符串格式,用于连接 Oracle 数据库。例如,...
select f_find('Ap@2233ll@@l@@','@') from dual 返回结果为5,代表‘@’在该字符串中出现5次。 同理 select f_find('Ap@223SWEQQQ3ll@@l@@','Q') from dual---返回3,代表Q在字符串中出现了3次, select f_find('我...
在Oracle数据库中,对字符串进行处理是一项常见的需求,特别是在处理带有特定分隔符(如逗号`,`、冒号`:`等)的字符串时。本文将详细介绍如何利用Oracle内置函数来实现从含有逗号和冒号的字符串中提取特定部分的功能...
传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考
Oracle数据库在JSON处理方面提供了强大的功能,特别是在处理JSON字符串时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web服务与应用程序之间的数据传输。在Oracle中,处理JSON字符串...
在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...
在Oracle数据库中,进行字符串查询时,特别是当字符串中包含逗号等特殊字符时,我们需要巧妙地使用SQL的LIKE操作符来实现精确匹配。这里,我们面对的问题是想要查询DWDH字段中含有"飞信"但不包含"移动飞信"或"飞信...
综上所述,本文介绍了如何在SQL中实现截取用特定字符分割的字符串中的第n个子字符串的方法,并通过实例展示了其实际应用场景。这种方法不仅适用于简单的数据处理任务,还能够在复杂的数据分析项目中发挥重要作用。
通过以上内容,我们详细介绍了Oracle中日期与字符串转换的各种方法。这些转换不仅限于简单的日期格式化,还包括了日期的加减运算、时间戳与时区的处理等高级功能。掌握这些转换方法有助于提高SQL查询的灵活性和效率...
在实际应用中,常常需要结合使用`INSTR`和`SUBSTR`函数来实现更复杂的字符串处理逻辑。 ##### 示例3:根据分隔符截取子字符串 假设表`T_RCV_ISSUE`中有一个字段`WH_CD`,其中存储着类似于`'MR-PS+007'`或`'MR-WS+...
这里利用了函数 regexp_substr和connect by 及oracle的正则相关函数实现oracle分割字符串方法
### Oracle 判断字符串是否能转换为数字的方法 在Oracle数据库中,我们经常需要处理各种数据类型之间的转换。尤其是在处理字符型数据时,有时我们需要判断一个字符串是否能够被成功地转换成数字类型。与SQL Server...
### Oracle字符串处理函数详解 #### 1. ASCII ASCII函数用于返回给定字符的ASCII码值。例如: ``` SQL> select ascii('A') A, ascii('a') a, ascii('0') zero, ascii(' ') space from dual; AAZERO SPACE ------...
oracle在存储过程中执行字符串中存有的sql语句
sql中while循环控制,不需要获取数据到程序语言中处理。 SQL中直接进行json格式字符串处理,省掉数据库和程序直接的调用
### Oracle常用字符串处理函数 在Oracle数据库中,字符串处理函数是非常重要的工具,它们可以帮助我们高效地管理和操作数据。本文将详细介绍几种常用的字符串处理函数及其应用方法。 #### 1. LTRIM 和 RTRIM ...