从完整表中删除特殊字符

时间:2017-01-16 14:11:31

标签: sql oracle function plsql procedure

我有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

2 个答案:

答案 0 :(得分:1)

如评论中所述,您可以尝试使用SQL,如下所示:

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

where <condition> ;

答案 1 :(得分: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;
/