SQL语法哪里出错了。

不訴離傷 2011-08-26 11:39:46
哪里出错了。

declare
tname varchar2(60);
cname varchar(100);
dlength number;
maxlength number;
begin
maxlength := 0;
for idx in (select u.TABLE_NAME,
u.COLUMN_NAME,
u.DATA_LENGTH,
decode(mod(u.DATA_LENGTH, 2), 0, 'EVEN', 'ODD') ODD_EVEN
from user_tab_columns u
where u.DATA_TYPE = 'VARCHAR2'
and u.TABLE_NAME in
(select t.table_name
from all_tables t
where t.num_rows > 0
and t.owner = 'BXDB')) loop
tname := idx.TABLE_NAME;
cname := idx.COLUMN_NAME;
dlength := idx.DATA_LENGTH;
execute immediate 'select max(lengthb(' || cname || ')) from ' || tname
into maxlength;
if (1.5 * maxlength) > dlength then
if idx.odd_even = 'ODD' then
dbms_output.put_line('alter table ' || tname || ' modify ' ||

cname || 'varchar2(' || 2 * maxlength || ');');
else
dbms_output.put_line('alter table ' || tname || ' modify ' ||
cname || 'varchar2(' || 1.5 * maxlength || ');');
end if;
end if;
end loop;
end;
...全文
187 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alessandro_ 2011-08-29
  • 打赏
  • 举报
回复
学习学习。
nmyangmz 2011-08-28
  • 打赏
  • 举报
回复
路过!学习学习!
BenChiM888 2011-08-28
  • 打赏
  • 举报
回复

--测试了一下没问题,你想直接spool的话,可以将拼出的直接按照下面的方法执行
declare
tname varchar2(60);
cname varchar(100);
dlength number;
maxlength number;
begin
maxlength := 0;
for idx in (select u.TABLE_NAME,
u.COLUMN_NAME,
u.DATA_LENGTH,
decode(mod(u.DATA_LENGTH, 2), 0, 'EVEN', 'ODD') ODD_EVEN
from user_tab_columns u
where u.DATA_TYPE = 'VARCHAR2'
and u.TABLE_NAME in
(select t.table_name
from all_tables t
where t.num_rows > 0
and t.owner = 'BXDB')) loop
tname := idx.TABLE_NAME;
cname := idx.COLUMN_NAME;
dlength := idx.DATA_LENGTH;
execute immediate 'select max(lengthb(' || cname || ')) from ' || tname
into maxlength;
if (1.5 * maxlength) > dlength then
if idx.odd_even = 'ODD' then
dbms_output.put_line('alter table ' || tname || ' modify ' ||

cname || 'varchar2(' || 2 * maxlength || ');');
else
-- dbms_output.put_line('alter table ' || tname || ' modify ' ||
-- cname || 'varchar2(' || 1.5 * maxlength || ');');
execute immediate 'alter table ' || tname || ' modify ' ||
cname || 'varchar2(' || 1.5 * maxlength ); --这里直接执行就完了呗
end if;
end if;
end loop;
end;

cr75608859 2011-08-27
  • 打赏
  • 举报
回复
学习学习!
Rotel-刘志东 2011-08-26
  • 打赏
  • 举报
回复
实际的物理内存不够造成缓存不够用造成的吧。
不訴離傷 2011-08-26
  • 打赏
  • 举报
回复
对对,却是这样的。还有里面alter语句'alter table ' || tname || ' modify ' ||
cname || 'varchar2(' || 1.5 * dlength || ');'); 该应是dlength ,我写错了,不过这个是业务问题。谢谢你。caoleione 的回复:]

应该是output输出的的太多 缓存不够造成的吧
[/Quote]
caoleione 2011-08-26
  • 打赏
  • 举报
回复
应该是output输出的的太多 缓存不够造成的吧
caoleione 2011-08-26
  • 打赏
  • 举报
回复
如果有错误 把错误贴出来看一下
不訴離傷 2011-08-26
  • 打赏
  • 举报
回复
全部搞定了。。。上面只是缓存不够。
caoleione 2011-08-26
  • 打赏
  • 举报
回复
cname || '这里加空格varchar2(' || 2 * maxlength || ');');
其它测试执行没有语法错误
opps_zhou 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 opps_zhou 的回复:]
SQL code


'select max(lengthb(' || cname || ')) from ' || tname



这一段代码, cname 前后需要加单引号
或者你使用绑定变量 execute immediate 后接 using
[/Quote]

不对,我看错了。。。
opps_zhou 2011-08-26
  • 打赏
  • 举报
回复

'select max(lengthb(' || cname || ')) from ' || tname


这一段代码, cname 前后需要加单引号
或者你使用绑定变量 execute immediate 后接 using
hanzs 2011-08-26
  • 打赏
  • 举报
回复
错误贴出来看下啊
不訴離傷 2011-08-26
  • 打赏
  • 举报
回复
这样是能实现output输出到屏幕上,但是能否在PLSQL程式里,用spool导出结果到SQL脚本呢?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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