私は、Oracle 11gのを使用しています。私のテーブルには、nameやl_nameのようなカラムが含まれています(名前カラムの小文字)。私は、それぞれの大文字列の小文字にl_列を設定するために、私のテーブルスペース内のすべての列を反復しようとしています。オラクル:動的な列名を使用して更新テーブル
for i in (select table_name from user_tables) loop
SELECT SUBSTR(column_name,3) bulk collect into my_temp_storage FROM user_tab_columns WHERE table_name = i.table_name and column_name like 'L\_%' escape '\';
for j in (select column_name from user_tab_columns where table_name = i.table_name) loop
for k in 1..my_temp_storage.count
loop
if(j.column_name like 'L\_%' escape '\' and SUBSTR(j.column_name,3) = my_temp_storage(k)) then
DBMS_OUTPUT.PUT_LINE('update ' || i.table_name || ' set ' || j.column_name || ' = LOWER(' ||my_temp_storage(k)|| ') where ' || j.column_name || ' is not null');
execute immediate 'update ' || i.table_name || ' set ' || j.column_name || ' = LOWER(' ||my_temp_storage(k)|| ') where ' || j.column_name || ' is not null';
end if;
end loop;
end loop;
end loop;
私はmy_temp_storageに大文字のすべての列の名前を格納し、my_temp_storageの列LOWER値でテーブルを更新しています:ここで私が試したものです。これは言って私にエラーを与えた:
Error report -
ORA-00900: invalid SQL statement
ORA-06512: at line 8
00900. 00000 - "invalid SQL statement"
*Cause:
*Action:
をしかし、DBMS出力は細かいように見えた:
`update EMPLOYEE set L_NAME = LOWER(NAME) where L_NAME is not null`
あなたは私がやった方法や、それを行うことができる他の方法で私を助けてもらえますか?
これは、あなたがこの周り 'begin'と' end'を持っていない私の仕事シートとライン8上の唯一のことは、「即時実行」ステートメント – rav
が含まれているのですか?そして 'my_temp_storage'の宣言? –
あなたは、任意のテーブルまたは予約語やキーワードで指定したカラム、および/または引用符で囲まれた識別子を持っていますか?実行即時コメントアウトでこれを実行するとどうなりますか? –