我开发了以下代码来从shell脚本testshell.sh
#!/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
请告诉我如何解决这个问题。
答案 0 :(得分:2)
如果你的替代变量是一个字符串,那么你需要在它被使用时引用它,而不是在它被传入时引用它。目前它没有引号所以它是&#39;被视为对象标识符,并且没有匹配的对象或变量,因此错误。
所以你的SQL脚本将是:
set verify off
DECLARE
attributeName varchar2(255):='&1';
BEGIN
DBMS_OUTPUT.put_line (attributeName);
END;
/
当然,您不需要定义局部变量,但我认为您现在正在尝试简单的案例。
set verify off
会停止显示的old
和new
消息。 Thos对于调试很有用,但通常只是噪音。
然后你可以用:
来调用它feed=`sqlplus -s uname/pwd <<-EOF
@test.sql Test_VAl
exit;
EOF`
或者,如果您在脚本中包含exit
,则可以执行以下操作:
feed=`sqlplus -s uname/pwd @test.sql Test_VAl`