【发布时间】:2019-03-23 03:37:44
【问题描述】:
我有一个很奇怪的问题,希望你的眼睛能帮助解决它。
我定义了一个函数,它通过 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:11.2 版生产
版权所有 (c) 1982, 2013,甲骨文。版权所有。
连接到:
Oracle 数据库 11g 企业版 11.2 版
SQL> SQL>
MAX(SUBSCRIPTION_ID)+1
-------------------------------------
1082
经过:00:00:00.00
SQL> 从 Oracle Database 11g 企业版 11.2 版断开连接
[root@localhost]> NewUserSubID
SQL*Plus:11.2 版生产
版权所有 (c) 1982, 2013,甲骨文。版权所有。
连接到:
Oracle 数据库 11g 企业版 11.2 版
SQL> SQL>
MAX(SUBSCRIPTION_ID)+2
-------------------------------------
1083
经过:00:00:00.00
SQL> 从 Oracle Database 11g 企业版 11.2 版断开连接
[root@localhost]> NewUserSubID
SQL*Plus:11.2 版生产
版权所有 (c) 1982, 2013,甲骨文。版权所有。
连接到:
Oracle 数据库 11g 企业版 11.2 版
SQL> SQL>
MAX(SUBSCRIPTION_ID)+3
-------------------------------------
1084
经过:00:00:00.00
SQL> 从 Oracle Database 11g 企业版 11.2 版断开连接
[root@localhost]> NewUserSubID
SQL*Plus:11.2 版生产
版权所有 (c) 1982, 2013,甲骨文。版权所有。
连接到:
Oracle 数据库 11g 企业版 11.2 版
SQL> SQL>
MAX(SUBSCRIPTION_ID)+4
-------------------------------------
1085
经过:00:00:00.00
SQL> 从 Oracle Database 11g 企业版 11.2 版断开连接
但是,当函数通过管道传递到 AWK 语句中时,函数不再迭代,这是没有意义的!请参阅下面的输出:
[root@localhost] > NewUserSubID | awk 'NR==9{打印 $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{打印 $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{打印 $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{打印 $1}'
1086
[root@localhost] > NewUserSubID | awk 'NR==9{打印 $1}'
1086
我不明白。大声笑,我真的希望我只是忽略了一些简单的事情,但我没有想法。任何帮助都会很棒!
【问题讨论】: