oracle - 管道破裂迭代?

标签 oracle bash awk oracle11g

我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。

我定义了一个函数,它通过 BASH 连接到 Oracle SQL 数据库。连接后,我使用 HEREDOC传递一个简单的 select 语句,该语句查找最大订阅 id 并根据该函数被调用的次数递增它。这是代码:

    #!/bin/bash
    PASS=0
    function NewUserSubID(){
    PASS=$(($PASS+1))
    sqlplus "${DB_USER}"/"${DB_PASS}" <<EOF
    set echo on timing on lines 200 pages 100
    select max(SUBSCRIPTION_ID)+${PASS} from ${DB_ENV}.USER_DATA;
    EOF
    }

当在命令行调用该函数时,上面的代码效果很好:

[root@localhost]> NewUserSubID
SQL*Plus: Release 11.2 Production
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2

SQL> SQL> 
MAX(SUBSCRIPTION_ID)+1
-------------------------------------
                                 1082
Elapsed: 00:00:00.00
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2


[root@localhost]> NewUserSubID
SQL*Plus: Release 11.2 Production
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2

SQL> SQL> 
MAX(SUBSCRIPTION_ID)+2
-------------------------------------
                                 1083
Elapsed: 00:00:00.00
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2


[root@localhost]> NewUserSubID
SQL*Plus: Release 11.2 Production
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2

SQL> SQL> 
MAX(SUBSCRIPTION_ID)+3
-------------------------------------
                                 1084
Elapsed: 00:00:00.00
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2


[root@localhost]> NewUserSubID
SQL*Plus: Release 11.2 Production
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2

SQL> SQL> 
MAX(SUBSCRIPTION_ID)+4
-------------------------------------
                                 1085
Elapsed: 00:00:00.00
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2

但是,当函数通过管道传输到 AWK 语句中时,函数不再迭代,这是没有意义的!请参阅下面的输出:

[root@localhost] > NewUserSubID | awk 'NR==9{print $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{print $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{print $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{print $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{print $1}'
1086

我不明白。哈哈,我真的希望我只是忽略了一些简单的事情,但我没有想法。任何帮助都会很棒!

最佳答案

问题是管道用作此处命令的一部分:

NewUserSubID | awk 'NR==9{print $1}'

由于管道创建了一个子 shell,因此子 shell 中任何变量所做的更改都不会反射(reflect)在父 shell 中。

您可以使用进程替换来避免使用子 shell:

$> NewUserSubID> >(awk 'NR==9{print $1}')
1086

$> NewUserSubID> >(awk 'NR==9{print $1}')
1087

$> NewUserSubID> >(awk 'NR==9{print $1}')
1088

关于oracle - 管道破裂迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838356/

相关文章:

java - Hibernate:顺序获取行的最佳方式

macos - 将关键字文件通过管道传送到 grep 中

Oracle 更改夏令时的时间戳列值

sql - 当我不知道名称时如何重命名约束

linux - Linux Mint 中的“RUN”不起作用

bash - 在bash脚本中减去两个时间戳

awk - 如何在 unix 中基于一个匹配列合并两个 csv 文件。两个文件中列的位置不同

macos - 为什么 fgrep 表现得很奇怪?

linux - 在 Linux 中删除包含这两种模式的行

c++ - Oracle 中触发 SQL 查询的底层机制