我有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
答案 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;
/