使用参数从shell脚本调用sql文件

时间:2014-05-21 06:17:15

标签: sql oracle shell oracle10g

我开发了以下代码来从shell脚本testshell.sh

调用sql文件
#!/usr/bin/env ksh
feed=`sqlplus -s uname/pwd <<-EOF
@test.sql 'Test_VAl'
/
exit;
EOF`
echo $feed;

我的sql文件是test.sql,其中包含以下内容:

   Declare

 attributeName varchar2(255):=&1;
BEGIN
     DBMS_OUTPUT.put_line (attributeName);

END;

我在执行时遇到以下错误。

old 3: attributeName varchar2(255):=&1;
new 3: attributeName varchar2(255):=Test_VAl;
attributeName varchar2(255):=Test_VAl; test.sql testshell.sh
ERROR at line 3:
ORA-06550: line 3, column 31: PLS-00201: identifier 'TEST_VAL' must be declared
ORA-06550: line 3, column 16: PL/SQL: Item ignored
ORA-06550: line 5, column 25: PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 3: PL/SQL: Statement ignored

请告诉我如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

如果你的替代变量是一个字符串,那么你需要在它被使用时引用它,而不是在它被传入时引用它。目前它没有引号所以它是&#39;被视为对象标识符,并且没有匹配的对象或变量,因此错误。

所以你的SQL脚本将是:

set verify off
DECLARE
  attributeName varchar2(255):='&1';
BEGIN
  DBMS_OUTPUT.put_line (attributeName);
END;
/

当然,您不需要定义局部变量,但我认为您现在正在尝试简单的案例。

set verify off会停止显示的oldnew消息。 Thos对于调试很有用,但通常只是噪音。

然后你可以用:

来调用它
feed=`sqlplus -s uname/pwd <<-EOF
@test.sql Test_VAl
exit;
EOF`

或者,如果您在脚本中包含exit,则可以执行以下操作:

feed=`sqlplus -s uname/pwd @test.sql Test_VAl`