2017-01-16 39 views
0

我有5到6個表格,其中我使用Excel文件插入數據,但我不知道最新的問題,但對於某些數據特殊字符正在添加,這給我的問題。所以他們是通過在某個過程中傳遞唯一Table_name來更新完整表的方法。目前我正在使用一個函數來更新列,但我想要更容易使用的東西(對於我的其他團隊成員)。 我正在使用下面的函數。從完整的表格中刪除特殊字符

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; 

,我怎麼能在一個過程傳遞表名和列名來更新表?我想這個代碼

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; 
/

錯誤我得到

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

爲什麼PLSQL ......你也可以在簡單的sql中做到這一點。只需在select語句中爲您獲取的特殊字符列表創建一個case語句,並將其替換爲null即可。 – XING

+0

這個過程將非常緩慢,你逐個處理每個字符。爲什麼不試圖用字符集來解決問題? –

+0

錯誤表明您的模式中沒有名爲'TABLE_NEW'的表。動態SQL需要「立即執行」和帶引號的字符串。 –

回答

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

添加你不希望在[^A-Za-z .]

移除。你可以做一個動態的SQL程序中的所有字符。否則,它不會選擇變量。像這樣:

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

如前所述在評論中,您可以嘗試使用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