背景: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去掉+号,该过程的错误并不是这个原因 展开
其中@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去掉+号,该过程的错误并不是这个原因 展开
展开全部
给你改成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;
/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |