2012-05-08 18 views
2

シェルスクリプトを使用して、特定の接尾辞(引数$ 1として渡される)を持つテーブルを削除しようとしています。シェルスクリプトでPLSQLブロックの実行に関する問題

子テーブルを削除せずに親テーブルを選択した場合は、親テーブルをバイパスして例外ブロック内のカウンタを増やしています。

$ 1を適切な値に置き換えたsql開発者でこのスクリプトを実行すると、動作します。しかし、私はこのシェルスクリプトを実行すると、それは固まっている。

あなたは一見して、私に知らせてください、私はシェルスクリプトで何が欠けていますか?

コード:

#!/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'メソッドには本当に間違ったことはありません。それは私の意見では、エコーの読み込みよりも読みやすいです。また、例外処理を失ってしまいましたが、間違いはあるものの、ref制約の問題を回避するために使用されている方法論には必要でした。元のコードで唯一の致命的な問題は '/'がないことです。 –

+0

ありがとうチャンドラ... :-) – Savitha