2017-01-16 9 views
0

私はExcelファイルを使用してデータを挿入しているテーブルを5〜6つ持っていますが、何が問題なのかわかりませんが、データの特殊文字が追加され、だから、何らかのprocedure.currentlyで私は1つの関数を使用してカラムを更新していますが、私は(私の他のチームメンバーのために)より使いやすいものがほしいと思っています。 私は以下の機能を使用しています。完全なテーブルから特殊文字を削除します

create or replace FUNCTION pfm_on_varchar(
    p_str IN VARCHAR2) 
    RETURN VARCHAR2 
IS 
    o_str VARCHAR2(4096) := ''; 
    asc_val NUMBER; 
BEGIN 
    FOR I IN 1 .. LENGTH(p_str) 
    LOOP 
    asc_val := ascii(SUBSTR(p_str,i,1)); 
    IF ((asc_val BETWEEN 48 AND 57) OR (asc_val BETWEEN 65 AND 90) OR (asc_val BETWEEN 97 AND 122)) THEN 
     o_str := o_str || chr(asc_val); 
    END IF; 
    END LOOP; 
    RETURN o_str; 
END pfm_on_varchar; 

とどのように私は私が述べたように、私は

Error(4,3): PL/SQL: SQL Statement ignored 
Error(4,10): PL/SQL: ORA-00942: table or view does not exist 
+1

なぜ単純なSQLでもこれを行うことができます。取得している特殊文字のリストをselectステートメントにcaseステートメントを作成し、nullに置き換えてください。 – XING

+0

この手順は非常に遅く、各文字を1つずつ処理します。なぜ文字セットで問題を解決しようとしないのですか? –

+0

このエラーは、スキーマに 'TABLE_NEW'という名前のテーブルが存在しないことを示しています。動的SQLには、 'execute immediate'と引用符付きの文字列が必要です。 –

答えて

0
update table 
set columnName = regexp_replace('This is a test. $%&^*&* ', '[^A-Za-z .?!]', '') 

あなたは動的SQLを行うことができます手順について[^A-Za-z .]

で削除したくないすべての文字を追加します。それ以外の場合は、変数を選択しません。このように:

CREATE OR REPLACE PROCEDURE removeSpecialChar(table_new IN varchar2, column_new IN varchar2) 
AS 
BEGIN 
    execute immediate 'update '||table_new|| 
    ' set '||column_new||' = PFM_ON_VARCHAR('||column_new||')'; 
    end removeSpecialChar; 
/
1

を取得しています。このコード

CREATE OR REPLACE PROCEDURE removeSpecialChar(table_new IN varchar2, column_new IN varchar2) 
AS 
BEGIN 
    update table_new 
    set column_new = PFM_ON_VARCHAR(column_new); 
    end removeSpecialChar; 
/

エラーをしようとしています?テーブルを更新するための手順で、テーブル名とカラム名を渡すことができますコメントでは、SQLを以下のように使用して試すことができます:

Update table1 
set columnname = case 
        when ascii(columnname) between 48 and 54 
        then replace (columnname,ascii(48),'') 
        end 

where <condition> ; 
+0

['ascii(str)'](http://docs.oracle.com/database/121/SQLRF/functions014.htm)は 'str'の最初の文字のみを調べます。列はより長い値を持ちます。 –

+0

私の列にはより長い値があるので、あなたは正しく機能していません。 – Tilak

関連する問題