在Shell脚本中执行PLSQL块的问题

Sav*_*tha 2 oracle shell plsql

我试图使用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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ole 7

/END;匿名块之后缺少一个,因此它永远不会执行它,并且exit将被视为上一个命令的一部分.这/与SQL Developer中的"run"非常相似.

...
END LOOP;

END;
/

exit
ENDDROPNEWTABS
Run Code Online (Sandbox Code Playgroud)

(您不需要BEGIN/ END周围SELECT,或NULL在异常处理程序,但那些不会破坏任何东西,它也不会默默壁球所有可能的异常,只是看你期待看到的是个好主意而且我个人觉得用一些缩进更容易理解.