0

私は、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` 

あなたは私がやった方法や、それを行うことができる他の方法で私を助けてもらえますか?

+0

これは、あなたがこの周り 'begin'と' end'を持っていない私の仕事シートとライン8上の唯一のことは、「即時実行」ステートメント – rav

+0

が含まれているのですか?そして 'my_temp_storage'の宣言? –

+0

あなたは、任意のテーブルまたは予約語やキーワードで指定したカラム、および/または引用符で囲まれた識別子を持っていますか?実行即時コメントアウトでこれを実行するとどうなりますか? –

答えて

1

プログラムは確かに単純化することができます。

begin 
    for i in (select table_name, column_name from user_tab_columns 
       where column_name like 'L\_%' escape '\') 
    loop 
     l_sql := 'update ' || i.table_name || ' set ' || i.column_name 
        || ' = LOWER(' ||substr(i.columm_name,3) 
        || ') where ' || i.column_name || ' is not null'; 
     execute immediate l_sql; 
    end loop;   
end; 

それはしかし奇妙なデータベース設計と思われます。手動で管理されている列ではなく、仮想列や関数ベースの索引を考慮しましたか?

+0

私は最初に似たようなことを試みました。しかし、LOWER( '|| substr(i.columm_name、3))は、同じ列(L_列)からサブストリングを戻します。 – rav

+0

それは列ではない、その値の** **名をsubstringingされるので、それは問題ではありませんか? –

+0

これは動作しています。どうもありがとうございます。私が以前に試みた方法は次のとおりです:LOWER(substr( '|| i.columm_name ||'、3)実際には同じ列の小文字の値を与えました – rav

関連する問題