2

シェル スクリプトを使用して、特定のサフィックス (引数 $1 として渡される) を持つテーブルを削除しようとしています。

子テーブルを削除せずに親テーブルを選択すると、親テーブルをバイパスし、例外ブロックのカウンターを増やします。

$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/pwd@sid @dropnewtabs.sql >tablesDropped.txt

#END
4

2 に答える 2

8

匿名ブロックの/後にaがないため、実行されず、前のコマンドの一部として表示されます。これは、SQL Developer の「実行」に非常に似ています。END;exit/

...
END LOOP;

END;
/

exit
ENDDROPNEWTABS

BEGIN( /ENDの前後SELECTや例外ハンドラは必要ありませんが、NULLそれらは何も壊しません。また、考えられるすべての例外を黙って押しつぶすこともお勧めできません。表示されると予想される例外を探してください。 . 個人的には、インデントを付けた方がわかりやすいと思います)。

于 2012-05-08T09:47:57.653 に答える
1
#!/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"
于 2012-05-08T10:17:44.783 に答える