私は頻繁にデータベース&のユーザーではありません。いくつかのPL/SQLブロックを作成/実行/実行する必要があります。私は、Oracleデータベース・ユーザーにSYSDBAとしてSYSとして実行中に以下のブロックを有する場合、エラーをスローし、今同様の状況がある: -行1のエラー:ORA-00911:無効な文字ORA-06512:行17
DECLARE
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 17
PL/SQLブロックは以下の通りであります: -
DECLARE
TYPE RefCurTyp IS REF CURSOR;
alter_tbl VARCHAR2(200);
a_null CHAR(1);
tbl VARCHAR2(200);
clmn VARCHAR2(200);
dtyp VARCHAR2(200) ;
dlth VARCHAR2(200);
c RefCurTyp;
BEGIN
open c for 'select utc.table_name, utc.column_name, utc.data_type, utc.data_length FROM user_tab_columns utc, user_tables ut
WHERE utc.data_type = ''VARCHAR2'' AND utc.char_used =''B'' AND ut.table_name = utc.table_name';
LOOP
dbms_output.put_line(clmn);
FETCH c INTO tbl, clmn, dtyp, dlth;
EXIT WHEN c%NOTFOUND;
EXECUTE IMMEDIATE
'alter table '||tbl||' modify ('||clmn||' '||dtyp||'('||dlth||' CHAR))';
END LOOP;
CLOSE c;
END;
も、私はこれで問題を把握することができません3日間それを私の頭を叩きました。すべての入力をいただければ幸いです。
私が手にヒキガエルを経由して同じコードを実行している間: -
動的SQLでエラーが発生した場合、実行しようとしているものを正確に表示するために 'dbms_output()'コールを追加すると便利です。あなたはおそらく少なくとも出力のテーブル名を取得しているはずです(もちろん、serveroutputを設定している場合)ので、どのテーブルが既に失敗しているかを知ることができます。それについて何が違うのですか?私はそれが奇妙な何かを含む引用符で囲まれた識別子を持つ列を持っていると推測しますが、推測しかできません。実際に生成されたalterコマンドを表示すると、それが明白になるはずです。 –
また、なぜSYSが所有するテーブルを変更していますか?それは良いアイデアのようには思えません。 –
dlthは長さです...タイプを 'modify varchar2(10 CHAR)'に変更しようとしました...私には構文が正しくないように見えますが、動的SQLは 'modify A varchar2(10)'のようにすべきです。 – are