2017-01-16 66 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