使用rexexp_replace将所有CRLF替换为\ r \ n
我有一个过程,需要从SQL语句中剥离所有CRLF,并使用字面字符\ r \ n存储它们,并将其存储在.json文件中。稍后,当将.json文件插入数据库时,此过程会相反。
我正在使用Oracle 19c。
原始的(缩写)SQL可能看起来像这样:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME
FROM sztdhof
LEFT JOIN SPRIDEN
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM
RIGHT JOIN SSBSECT
ON sztdhof_CRN = SSBSECT_CRN
WHERE spriden_change_ind IS NULL
结果字符串应该看起来像这样:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\nFROM sztdhof\r\nLEFT JOIN SPRIDEN\r\nON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\nRIGHT JOIN SSBSECT\r\nON sztdhof_CRN = SSBSECT_CRN \r\nWHERE spriden_change_ind IS NULL
我尝试了多种方法来获取Oracle Regexp_replace来识别托架返回和线条馈送在一起。似乎没有工作。
首先,我将DB的值读取为变量V_TEXT。然后,我尝试转换并将结果放入第二个变量v_outtext中。如果我使用两个单独的语句,则每个语句单独起作用。我可以使用这种方法,但我希望这可以作为一个声明。 (注意。我还尝试了使用类似结果的替换函数。)
此代码
SELECT REPLACE (v_text, chr(13) , '\r\n')
INTO v_outtext
FROM dual;
...
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\n
FROM sztdhof\r\n
LEFT JOIN SPRIDEN\r\n
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\n
RIGHT JOIN SSBSECT\r\n
ON sztdhof_CRN = SSBSECT_CRN \r\n
WHERE spriden_change_ind IS NULL\r\n
选择Regexp_replace(v_text,chr(10),'\ r \ n')
-与上面相似,除了\ r \ n在每行的前部。
选择Regexp_replace(v_text,(chr(13)chr(10),'\ r \ n')
给我一个错误,缺少右括号。
select regexp_replace(v_text(v_text)(\ r \ n)',\ r \ n')
用\ n代替\ n,但
我只尝试了许多迭代。
I have a process that needs to strip all CRLF from SQL statements and store them with literal characters \r\n and stores this in a .json file. Later, this process is reversed when the .json file is inserted back into the database.
I am using ORACLE 19c.
The original (abbreviated) SQL might look like this:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME
FROM sztdhof
LEFT JOIN SPRIDEN
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM
RIGHT JOIN SSBSECT
ON sztdhof_CRN = SSBSECT_CRN
WHERE spriden_change_ind IS NULL
The resulting string should look like this:
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\nFROM sztdhof\r\nLEFT JOIN SPRIDEN\r\nON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\nRIGHT JOIN SSBSECT\r\nON sztdhof_CRN = SSBSECT_CRN \r\nWHERE spriden_change_ind IS NULL
I have tried numerous ways to get ORACLE REGEXP_REPLACE to recognize the carriage return and line feed together. None seem to work.
To start, I read the value from the db into a variable v_text. Then I attempt the conversion and placing the result into a second variable v_outtext. If I use two separate statements, each works separately. And I can live with that method, but I would like this to work as a single statement. (Note. I have also tried the REPLACE function with similar results.)
This code...
SELECT REPLACE (v_text, chr(13) , '\r\n')
INTO v_outtext
FROM dual;
produces...
SELECT SPRIDEN_ID, SPRIDEN_LAST_NAME, SPRIDEN_FIRST_NAME\r\n
FROM sztdhof\r\n
LEFT JOIN SPRIDEN\r\n
ON sztdhof.SZTDHOF_PIDM = spriden.SPRIDEN_PIDM\r\n
RIGHT JOIN SSBSECT\r\n
ON sztdhof_CRN = SSBSECT_CRN \r\n
WHERE spriden_change_ind IS NULL\r\n
SELECT REGEXP_REPLACE(v_text, chr(10) , '\r\n')
--is similar to above, except the \r\n are at the front of each line.
SELECT REGEXP_REPLACE(v_text, (chr(13)chr(10) , '\r\n')
gives me an error, missing right parenthesis.
SELECT REGEXP_REPLACE (v_text, '(\r\n)', '\r\n')
replaces r with \r and n with \n, but only the first instance.
I have tried numerous iterations. None solve the problem. Any thoughts would be welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要加入要替换的两个字符,而不仅仅是将它们放在括号中(即使您两者都提供):
如果它已经在PL/SQL变量中;您可以简化:
但是,听起来您可以使用第一个方法将数据库中的值读取为
v_outtext
,而没有InterMediatev_text
。You need to concatenate the two characters you want to replace, not just put them in parentheses (even if you supplied both):
If if it's already in a PL/SQL variable you don't need to to the context switch to select from dual; you can simplify to:
but it sounds like you can use the first method to read the value from the database into
v_outtext
in one go, without the intermediatev_text
.db<>fiddle