我正在尝试使用shell脚本删除具有特定后缀(作为参数$ 1传递)的表。
如果选择了父表而没有删除子表,我绕过父表并增加异常块中的计数器。
当我在sql开发人员中运行此脚本并将$ 1替换为正确的值时,它可以正常工作。但是当我运行这个shell脚本时,它就会卡住。
请您看一下,让我知道,我在shell脚本中缺少什么?
代码:
#!/bin/bash
cat <<ENDDROPNEWTABS >dropnewtabs.sql
set pagesize 100
DECLARE
t_cnt NUMBER;
CURSOR C001
IS
SELECT table_name FROM user_tables WHERE table_name LIKE '%$1%';
BEGIN
BEGIN SELECT COUNT(*) INTO t_cnt FROM user_tables WHERE table_name LIKE '%$1%';
END;
WHILE(t_cnt > 0) LOOP
FOR i IN C001 LOOP
BEGIN EXECUTE IMMEDIATE 'DROP TABLE '||i.table_name;
EXCEPTION
WHEN OTHERS THEN
t_cnt := t_cnt+1;
NULL;
END;
t_cnt := t_cnt-1;
END LOOP;
END LOOP;
END;
exit
ENDDROPNEWTABS
echo "Dropping the tables created for this task..."
sqlplus -s usn/pwd@sid @dropnewtabs.sql >tablesDropped.txt
#END
答案 0 :(得分:7)
您在匿名阻止的/
之后缺少END;
,因此永远不会执行它,exit
将被视为上一个命令的一部分。 /
与SQL Developer中的'run'非常类似。
...
END LOOP;
END;
/
exit
ENDDROPNEWTABS
(您不需要BEGIN
周围的END
/ SELECT
或异常处理程序中的NULL
,但这些不会破坏任何内容;它是也不是一个好主意,无声地压缩所有可能的异常,只是寻找你期望看到的那个。而且我个人觉得跟一些缩进更容易。)
答案 1 :(得分:0)
#!/bin/ksh
PSQL1=dropnewtabs.sql
TABNAME=$1
echo $1
>tablesDropped.txt
>$PSQL1 #this command will create a new empty file
echo "set echo off feed off head off pages 0 " >> $PSQL1
echo "set serveroutput on " >> $PSQL1
echo "set define off " >> $PSQL1
echo "DECLARE " >> $PSQL1
echo "CURSOR C001 " >> $PSQL1
echo "IS " >> $PSQL1
echo "SELECT table_name FROM user_tables WHERE table_name = '$TABNAME'; " >> $PSQL1
echo "BEGIN " >> $PSQL1
echo "FOR i IN C001 " >> $PSQL1
echo "LOOP " >> $PSQL1
echo "EXECUTE IMMEDIATE 'DROP TABLE '|| i.table_name ; " >> $PSQL1
echo "dbms_output.put_line('TEST-------->'); " >> $PSQL1
echo "END LOOP; " >> $PSQL1
echo "END; " >> $PSQL1
echo "/ " >> $PSQL1
echo "exit;" >> $PSQL1
echo "Dropping the tables created for this task..."
sqlplus -s user/pwd@sid @$PSQL1 >>tablesDropped.txt 2>&1
echo "Complete"