背景:oracle数据库 要求:对所有有字段A的表进行批量update,更新字段A下包含值B的部分replace为C

但是我写了以下这个存储过程,却错报,希望高手帮忙看下为什么不能执行其中@fieldName代表字段A@oldValue代表字段A中需要替换部分的原值@newValue代表... 但是我写了以下这个存储过程,却错报,希望高手帮忙看下为什么不能执行
其中@fieldName代表字段A
@oldValue 代表字段A中需要替换部分的原值
@newValue 代表替换到字段A中去的新值
CREATE OR REPLACE PROCEDURE UPDATEWZ(@fieldName VARCHAR(90),
@oldValue VARCHAR(90),
@newValue VARCHAR(90))
AS
DECLARE @tableName VARCHAR(100)
DECLARE @sqlStmt VARCHAR(100)

BEGIN
DECLARE tablenamecursor CURSOR FOR
SELECT t.TABLE_NAME
FROM user_tab_columns t
WHERE t.COLUMN_NAME = @fieldName
OPEN tablenamecursor

BEGIN
FETCH t.TABLE_NAME INTO @tableName

SET @sqlStmt = 'update ' + @tableName + ' set ' + @fieldName
+ ' = ' + replace + '+'(@fieldName,'@oldValue','@newValue')'
PRINT @sqlStmt
EXEC(@sqlStmt)
END

CLOSE tablenamecursor
DEALLOCATE tablenamecursor
END

因为本人目前没有财富值,所以只希望有高手友情帮忙了,非常感谢
SET @sqlStmt = 'update ' + @tableName + ' set ' + @fieldName
+ ' = ' replace '+'(@fieldName,'@oldValue','@newValue')'
PRINT @sqlStmt
EXEC(@sqlStmt)

此处replace去掉+号,该过程的错误并不是这个原因
展开
 我来答
sxdtgsh
2013-06-19 · TA获得超过2221个赞
知道小有建树答主
回答量:913
采纳率:75%
帮助的人:804万
展开全部

给你改成oracle的了。

CREATE OR REPLACE PROCEDURE UPDATEWZ(vfieldName VARCHAR2(90),
                                     voldValue  VARCHAR2(90),
                                     vnewValue  VARCHAR2(90)) AS
    vtableName VARCHAR2(100);
    vsqlStmt VARCHAR2(100);
BEGIN
   for tablenamecursor in (SELECT t.TABLE_NAME
                                                 FROM   user_tab_columns t
                                               WHERE  t.COLUMN_NAME = vfieldName)  loop
      vsqlStmt = 'update '  ||  vtableName  || '  set  '  ||  vfieldName
                                             || ' =  ' || 'replace (' || vfieldName || ',' || Chr(39) || voldValue || Chr(39) || ',' || Chr(39) || vnewValue 
                                             || Chr(39) || ')';
     dbms_sqloutput.put_line(vsqlStmt);
     Excute immediate vsqlStmt;
  end loop;
END;
/
追问
放在oracle中执行还是错误的。。。不过还是很感谢
追答
-- oracle定义参数的时候,数据类型不需要加精度
CREATE OR REPLACE PROCEDURE UPDATEWZ(vfieldName VARCHAR2,
                                     voldValue  VARCHAR2,
                                     vnewValue  VARCHAR2) AS
    vtableName VARCHAR2(100);
    vsqlStmt VARCHAR2(100);
BEGIN
   for tablenamecursor in (SELECT t.TABLE_NAME
                                                 FROM   user_tab_columns t
                                               WHERE  t.COLUMN_NAME = vfieldName)  loop
      -- 少了这句
      vtableName :=  tablenamecursor.TABLE_NAME;
      -- 这里少个:
      vsqlStmt := 'update '  ||  vtableName  || '  set  '  ||  vfieldName
                                             || ' =  ' || 'replace (' || vfieldName || ',' || Chr(39) || voldValue || Chr(39) || ',' || Chr(39) || vnewValue 
                                             || Chr(39) || ')';
     dbms_output.put_line(vsqlStmt);
     --Excute immediate vsqlStmt;
  end loop;
END;
/
zj_ljgong
2013-06-19 · TA获得超过269个赞
知道小有建树答主
回答量:482
采纳率:78%
帮助的人:135万
展开全部
你的存储过程不是Oracle下用的,是不是在Sybase下跑的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式