我目前有以下功能,我知道输出的查询在我通过GUI SQL Client手动运行时有效,但它不能用于Bash ... 我尝试了所有我能想到的东西,用Google搜索了我能想到的关键词......
AssignChunksToDocs()
{
TEST="set heading off;
set trim on;
DECLARE
i number;
BEGIN
i := 1;
while i<=$CHUNK_AMOUNT LOOP
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL
AND ROWNUM <=$DOCS_PER_CHUNK;
i := i+1;
END LOOP;
i := i-1;
-- Deal with the remainder
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL;
end;"
sqlplus -s $CONSTR<<ENDOFSQL
set heading off;
set trim on;
DECLARE
i number;
BEGIN
i := 1;
while i<=$CHUNK_AMOUNT LOOP
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL
AND ROWNUM <=$DOCS_PER_CHUNK;
i := i+1;
END LOOP;
i := i-1;
-- Deal with the remainder
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL;
end;
ENDOFSQL
ERRORCODE=$?
if [ $ERRORCODE != 0 ]
then
echo "********************"
echo "ERROR: The SQL Plus Command Failed. ErrorCode: $ERRORCODE"
else
echo "********************"
echo "SQL Plus Successfully Ran. ErrorCode: $ERRORCODE"
fi
}
当我运行它(在shebang中使用-x)时,我得到以下代码段:
+ AssignChunksToDocs
+ TEST='set heading off;
set trim on;
DECLARE
i number;
BEGIN
i := 1;
while i<=
64 LOOP
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL
AND ROWNUM <=3;
i := i+1;
END LOOP;
i := i-1;
-- Deal with the remainder
UPDATE TABLE T SET T.CHUNK_NUM = i
WHERE T.CHUNK_NUM IS NULL;
end;'
+ sqlplus -s dbuser/dbpass@hostname/sidname
+ ERRORCODE=0
+ '[' 0 '!=' 0 ']'
+ echo '********************'
********************
+ echo 'SQL Plus Successfully Ran. ErrorCode: 0'
SQL Plus Successfully Ran. ErrorCode: 0
在终端命令行中对查询进行手动测试也是如此,然后手动粘贴&lt;&lt; SQL ... SQL块。
请帮助:)
答案 0 :(得分:0)
该问题原来是一个缺失的COMMIT;
声明!
在将来,如果出现奇怪的情况,如果没有错误,但DB中没有明显的情况发生,请让DBA查找表锁!
两次是因为它不能用于丢失COMMIT;在每个更新声明之后。