大家帮忙看看这个存储过程有什么问题,编译不通过

WardenMoon 2008-05-14 02:50:55
想写一个存储过程,修改库中指定表指定字段(该字段为Date类型)类型为varchar2(20),
我的做法是:新增一列(名字与原列名不一样),拷贝数据,删除原来列,修改新列列名为原列名;
实现这个做法的存储过程如下,但是创建的时候编译出错,
各位高手帮忙看看错在哪里?

CREATE OR REPLACE PROCEDURE UP_AlterDateColumn
(tName varchar2,
cName varchar2
)
AS
cName_temp varchar2;
v_sql varchar2(3000);
begin
cName_temp := cName || '_temp';
begin
--增加一列
v_sql := 'alter table ' || tName || ' add ' || cName_temp || ' varchar2(20)';
execute immediate v_sql;
--Copy数据
v_sql := 'update ' || tName || ' set ' || cName_temp || ' = ' || cName;
execute immediate v_sql;
--删除列
v_sql := 'alter table ' || tName || ' drop column ' || cName;
execute immediate v_sql;
--修改列名
v_sql := 'alter table ' || tName || ' rename column ' || cName_temp || ' to ' || cName;
execute immediate v_sql;
commit;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
end;
end UP_AlterDateColumn;
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
oracle_dba_11 2008-05-16
  • 打赏
  • 举报
回复
写程序要细心啊
robin_ares 2008-05-15
  • 打赏
  • 举报
回复
不过,为什么有两个begin,没用的
robin_ares 2008-05-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 WardenMoon 的回复:]
谢谢楼上两位的回答,还有,我在这个存储过程里面用的事务正确吗?如果出错能回滚吗?
[/Quote]
没问题,可以的
yun222222 2008-05-15
  • 打赏
  • 举报
回复
被 1楼抢了 和和~
WardenMoon 2008-05-15
  • 打赏
  • 举报
回复
谢谢楼上两位的回答,还有,我在这个存储过程里面用的事务正确吗?如果出错能回滚吗?
owl1230 2008-05-14
  • 打赏
  • 举报
回复
PROCEDURE DY.UP_ALTERDATECOLUMN 编译错误

错误:PLS-00103: 出现符号 "|"在需要下列之一时:
. ( * @ % & = - + ; < / > at
in is mod remainder not rem <an exponent (**)> <> or != or ~=
>= <= <> and or like between || multiset member SUBMULTISET_
行:12
文本:v_sql := 'alter table ' | | tName | | ' add ' | | cName_temp | | ' varchar2(20)';

所有的” | | “ 引号中为你的命令

都多了空格
--------------------------------

CREATE OR REPLACE PROCEDURE UP_AlterDateColumn
(tName varchar2,
cName varchar2
)
AS
cName_temp varchar2(20);
v_sql varchar2(3000);
begin
cName_temp := cName || '_temp';
begin
--增加一列
v_sql := 'alter table '|| tName || ' add ' || cName_temp || ' varchar2(20)';
execute immediate v_sql;
--Copy数据
v_sql := 'update ' || tName || ' set ' || cName_temp || ' = ' || cName;
execute immediate v_sql;
--删除列
v_sql := 'alter table ' || tName || ' drop column ' || cName;
execute immediate v_sql;
--修改列名
v_sql := 'alter table ' || tName || ' rename column ' || cName_temp || ' to ' || cName;
execute immediate v_sql;
commit;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
end;
end UP_AlterDateColumn;
-----------------------------------------------

编译成功
zmgowin 2008-05-14
  • 打赏
  • 举报
回复
1、AS
cName_temp varchar2;
后面没定义长度

2、¦ ¦ 注意半角全角

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧