我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。
我定义了一个函数,它通过 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/