我有一个运行良好的脚本TOAD
:
SELECT max (ID)+1 from apps_details;
当我尝试在 shell 脚本中运行它时,出现错误:
DB_CONNECT="XXXXX/XXXXX@XXXXXX"
echo "Inserting the DataBase"
/oravl01/oracle/12.1.0.1/bin/sqlplus -s $DB_CONNECT <<END
set head off
set feedback off
set pagesize 2400
set linesize 2048
ID_VAL=`SELECT max (ID)+1 from apps_details;`
exit
END
/pciuser/tools/jenkins/jenkins/scripts/Jenkins_Internal/Create_Jenkins_Container/InsertToDB.ksh[31]: syntax error at line 1: `(' unexpected
第 31行指的是oravl01
行,但我知道问题不存在,因为一旦我删除了ID_VAL
分配,它就可以工作。
编写它的正确语法是什么?
我认为首先定义你的命令然后运行它来保存它的输出要干净得多(也更简单):
这样,您可以轻松地将输出存储在一个变量中,并且您可以将命令与脚本流分开,这将使将来更容易理解和维护。
这些命令对我有用:
这里有一些替代方案,按照terdon 的回答,考虑到您试图将 SQL*Plus 的输出提取到 shell 变量中,这些替代方案试图使处理 SQL*Plus 的输出变得更容易
ID_VAL
。默认情况下,在 SQL*Plus 中执行的 SQL 语句会生成格式化报告,由列组成,其宽度取决于各自的数据类型。这将导致一些可能不需要的效果:例如,您在评论中指出的左侧填充数字。
示范:
一些替代方案:
如果要选择一个数字,请将其转换为字符串并在 SQL 语句中对其进行修整。上述脚本中的所有其他内容均未更改(
SELECT
为了便于测试,我将继续使用我的虚拟语句):dbms_output.put_line
在 PL/SQL 块中使用:请注意,这
set serveroutput on
是必需的,否则不会显示任何输出。使用 (1) 和 (2) 您将获得:
但是请注意,如果您选择的字符串带有要保留的侧翼空白字符(例如
foo
),这些方法将失败。您可以将该字符串括在引号中,然后将其删除,或者:让 SQL*Plus 将其输出格式化为 CSV:
与数字不同,字符串将被双引号括起来,需要一些后期处理。假设返回的值不包含
<newline>
字符,一种方法是使用sed
删除开始和结束"
字符(其他所有内容不变):最佳选择将取决于您的实际用例。