【发布时间】:2018-10-24 21:44:21
【问题描述】:
我想在与 shell 脚本中提到的条件匹配的文本之后添加一个语句。
以下是我的示例文件(SQL 文件):
begin
AFFECTED_ROWS := 0;
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
DELETE FROM table_name
WHERE condition;
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
MERGE INTO employees e
USING hr_records h
ON (e.id = h.emp_id)
WHEN MATCHED THEN
UPDATE SET e.address = h.address
WHEN NOT MATCHED THEN
INSERT (id, address)
VALUES (h.emp_id, h.address);
end;
一旦我按顺序看到以下任何文本,我将获取此文件并执行以下转换
1: "UPDATE ... SET ...;"
2: "DELETE ... FROM ...;"
3: "INSERT ... INTO ...;"
4: "MERGE ... INTO ... [WHEN MATCHED THEN | WHEN NOT MATCHED] ... [UPDATE|INSERT|DELETE] ... ;"
我需要在分号后添加 1 行:
AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
这样我的新文件看起来会像这样:
begin
AFFECTED_ROWS := 0;
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
DELETE FROM table_name
WHERE condition;
AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
MERGE INTO employees e
USING hr_records h
ON (e.id = h.emp_id)
WHEN MATCHED THEN
UPDATE SET e.address = h.address
WHEN NOT MATCHED THEN
INSERT (id, address)
VALUES (h.emp_id, h.address);
AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
end;
我尝试在 PLSQL 范围内查找和实施该方法,但没有找到任何可能的通用方法来影响行数,所以我想 文本解析,但我对 awk 或 sed 了解不多。
现在我想做的是:
sed '/Patterns Go Here/a AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;' temp.sql
所以模式可能有上面提到的条件。
【问题讨论】:
-
我没有看到拒绝投票的原因,至少应该说明为什么拒绝投票的原因,我已经根据堆栈溢出以清晰的方式提供了所有信息。
-
不幸的是,如果您的 SQL 语句被拆分为多行,这将非常困难。如果您可以将代码格式化为每行一个语句,那么任务将更加简单。
-
@l0b0 ,是的,实际上当查询在 1 行时我尝试使用 egrep 并且你是对的,这非常容易,但不幸的是,我将直接获取我想要的原始文件应用转换。