我正在尝试使用 shell 脚本删除具有特定后缀(作为参数 $1 传递)的表。
如果选择了父表而没有删除其子表,则我将绕过父表并增加异常 block 中的计数器。
当我在 sql Developer 中运行此脚本并将 $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
最佳答案
您在匿名 block 的 END;
之后缺少 /
,因此它永远不会执行它,并且 exit
将是被视为前一个命令的一部分。 /
非常类似于 SQL Developer 中的“运行”。
...
END LOOP;
END;
/
exit
ENDDROPNEWTABS
(您不需要 SELECT
周围的 BEGIN
/END
,也不需要 NULL
异常处理程序,但这些不会破坏任何东西;默默地消除所有可能的异常也不是一个好主意,只需寻找您期望看到的异常即可。而且我个人发现使用一些缩进更容易理解)。
关于oracle - 在 Shell 脚本中执行 PLSQL block 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495322/