1

特定の文字を見つけて置き換えるために、すべての列を繰り返し処理したいと考えています。ここに私のpl/sqlブロックがあります:

 Declare
  match_count     Number:=0;
  v_search_string VARCHAR2(4000) := '%ي%';
BEGIN
 FOR t IN
 (SELECT owner,
  table_name,
column_name
FROM all_tab_columns
 WHERE (SUBSTR(table_name,1,2)='PN'
OR (SUBSTR(table_name,1,2)   ='CD'
AND owner                    ='PNET_USER' ))
AND (data_type               ='VARCHAR2'
OR data_type                 ='CLOB')
)
LOOP
BEGIN
  EXECUTE IMMEDIATE 'SELECT count(*) FROM '||t.owner || '.' || t.table_name|| ' WHERE '||t.column_name||' LIKE :1' INTO match_count USING v_search_string;
  IF match_count > 0 THEN
    dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
    --EXECUTE IMMEDIATE 'UPDATE '||t.table_name||' SET '||t.column_name||'=replace()'
  END IF;
END;
END LOOP;

正常に機能し、無効な文字を含む列の名前を出力します。しかし、文字を置き換える方法がわかりません。t.column_nameの値を取得し、無効な文字を置き換えてから更新するにはどうすればよいt.table_nameですか?

4

2 に答える 2

2

まあ、それはほとんど問題ありませんでした(そしてステボの答えも)。あなたの文字で v_from と v_to を変更させてください。

Declare
  match_count     Number       :=0;
  v_from          varchar2(5)  := 'a';
  v_like          varchar2(5)  := '%'||v_from||'%';
  v_to            varchar2(5)  := 'b';
  v_sql           varchar2(1000);
  v_emesg         varchar2(1000);

  CURSOR s is
        (SELECT owner, table_name, column_name
        FROM    all_tab_columns
        where   SUBSTR(table_name,1,2)    IN ('PN', 'CD')
        AND     owner                     ='PNET_USER' 
        AND     data_type                 IN('VARCHAR2', 'CLOB'););
begin       
for t in s  LOOP
     begin
      EXECUTE IMMEDIATE 'SELECT count(*) FROM '||t.owner || '.' || t.table_name|| ' WHERE '||t.column_name||' LIKE :1' INTO match_count USING v_like;
      IF match_count > 0 THEN
            begin
            dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
            v_sql := 'UPDATE '||t.owner||'.'||t.table_name||' SET '||t.column_name||'= REPLACE('||t.column_name||', '''||v_from||''', '''||v_to||''') WHERE '||t.column_name||' LIKE '''|| v_like||'''';
            dbms_output.put_line(v_sql);

            EXECUTE IMMEDIATE v_sql;
            EXCEPTION WHEN OTHERS THEN
               v_emesg := SQLERRM;
               dbms_output.put_line(v_emesg);
               dbms_output.put_line('Errow while trying to update '||t.owner||'.'||.t.table_name||' : column '||t.column_name||'.';
            END;
      END IF;
      end;
  END LOOP;
end;
于 2012-05-13T22:41:25.577 に答える
-1

何かのようなもの

EXECUTE IMMEDIATE'UPDATE' || t.table_name || ' SET'|| t.column_name ||' = replace('|| t.column_name ||'、'' FROM''、'' TO'') '

FROMは無効な文字であり、TOは変更したい文字です。REPLACEの動作の説明については、リンクのoracleドキュメントを参照してください。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions134.htm

注意:これを試す場所がないため、構文が正しくない可能性があります。

于 2012-05-13T16:11:21.123 に答える