使用rexexp_replace将所有CRLF替换为\ r \ n

发布于 2025-02-06 14:48:32 字数 1539 浏览 3 评论 0原文

我有一个过程,需要从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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

左秋 2025-02-13 14:48:32

您需要加入要替换的两个字符,而不仅仅是将它们放在括号中(即使您两者都提供):

SELECT REPLACE(v_text, chr(13) || chr(10) , '\r\n')
INTO v_outtext
FROM dual;

如果它已经在PL/SQL变量中;您可以简化:

v_outtext := REPLACE(v_text, chr(13) || chr(10) , '\r\n');

但是,听起来您可以使用第一个方法将数据库中的值读取为v_outtext,而没有InterMediate v_text

You need to concatenate the two characters you want to replace, not just put them in parentheses (even if you supplied both):

SELECT REPLACE(v_text, chr(13) || chr(10) , '\r\n')
INTO v_outtext
FROM dual;

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:

v_outtext := REPLACE(v_text, chr(13) || chr(10) , '\r\n');

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 intermediate v_text.

db<>fiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文