2012-05-08 39 views
2

我正在嘗試使用shell腳本刪除具有特定後綴(作爲參數傳遞$ 1)的表。在Shell腳本中執行PLSQL塊的問題

如果在沒有刪除其子表的情況下選擇父表,我將繞過父表並增加異常塊中的計數器。

當我在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/[email protected] @dropnewtabs.sql >tablesDropped.txt 

#END 

回答

7

你缺少你匿名塊的END;/,所以它永遠不會執行它,並exit將被看作是先前命令的一部分。 /與SQL Developer中的'運行'非常類似。

... 
END LOOP; 

END; 
/

exit 
ENDDROPNEWTABS 

(你不需要SELECT,或在異常處理程序NULL圍繞BEGIN/END,但那些不會破壞任何東西,它也並不是一個好主意,悄悄壓扁所有可能的異常,只是尋找你期望看到的那個,而且我個人覺得跟一些縮進比較容易)。

+0

感謝亞歷克斯的解決方案。 :-)關於縮進,我故意刪除它認爲這將是問題的原因。 :) – Savitha

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/[email protected] @$PSQL1 >>tablesDropped.txt 2>&1 
echo "Complete" 
+3

OP使用的'cat'方法沒有任何問題;在我看來,閱讀比回聲更容易。而且,你已經失去了異常處理,雖然有缺陷,但對於避免參考約束問題的方法來說是必要的。原始代碼中唯一致命的問題是缺少'/'。 –

+0

謝謝Chandra ... :-) – Savitha