现在有这么个需求:
输入表名变量,如果表名不存在,则直接建表,否则drop后建表;
然后给表加个字段;修改第二个字段类型;清空表格;网表格里面插两条数;
下面是我的过程:
create or replace procedure p_train_sby_dummysql(v_table_name varchar2) is
exsist_table number;
begin
execute immediate 'select count(0) from user_tables where table_name = ''' ||v_table_name || '''' into exsist_table;
if exsist_table <> 0 then
execute immediate 'drop table' || v_table_name;
end if;
execute immediate 'create table' || v_table_name ||'
(t1 date,
t2 varchar2(10))';
execute immediate 'alter table' || v_table_name || 'add t3 varchar2(10)';
execute immediate 'alter table' || v_table_name || 'modify t2 number';
execute immediate 'truncate table' || v_table_name;
execute immediate 'insert into' || v_table_name ||
'values(to_date(''20110909'',''yyyymmdd''),12,''243sd'')';
execute immediate 'insert into' || v_table_name ||
'values(to_date(''20110901'',''yyyymmdd''),11,''243dxd'')';
commit;
end;
我的这个过程在test阶段输入表名之后,会弹错,说错误的create命令,有人知道是咋回事么?
我用别人的这个过程就可以完全运行:(下面是别人的可以运行的过程)
create or replace procedure p_train_liuqingsong_dummysql(v_table_name varchar2) is
if_exist number;
begin
execute immediate 'Select count(*) from user_tables where table_name = ''' || upper(v_table_name) || '''' into if_exist;
if if_exist <> 0 then
execute immediate 'drop table ' || v_table_name;
end if;
execute immediate 'create table ' || v_table_name || '
(t1 date,
t2 varchar2(10))'; --步骤一
execute immediate 'alter table ' || v_table_name ||
' add t3 varchar2(10)'; --步骤二
execute immediate 'alter table ' || v_table_name || ' modify t2 number'; --步骤三
execute immediate 'truncate table ' || v_table_name; --步骤四
execute immediate 'insert into ' || v_table_name ||
' values (to_date(''20071212'',''yyyymmdd''),123,''天天'')';
execute immediate 'insert into ' || v_table_name ||
' values (to_date(''20071216'',''yyyymmdd''),456,''地地'')';
commit; --步骤五
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
end
他的过程只是比我的过程多了个exception处理,请问我的为啥不可以谢谢
输入表名变量,如果表名不存在,则直接建表,否则drop后建表;
然后给表加个字段;修改第二个字段类型;清空表格;网表格里面插两条数;
下面是我的过程:
create or replace procedure p_train_sby_dummysql(v_table_name varchar2) is
exsist_table number;
begin
execute immediate 'select count(0) from user_tables where table_name = ''' ||v_table_name || '''' into exsist_table;
if exsist_table <> 0 then
execute immediate 'drop table' || v_table_name;
end if;
execute immediate 'create table' || v_table_name ||'
(t1 date,
t2 varchar2(10))';
execute immediate 'alter table' || v_table_name || 'add t3 varchar2(10)';
execute immediate 'alter table' || v_table_name || 'modify t2 number';
execute immediate 'truncate table' || v_table_name;
execute immediate 'insert into' || v_table_name ||
'values(to_date(''20110909'',''yyyymmdd''),12,''243sd'')';
execute immediate 'insert into' || v_table_name ||
'values(to_date(''20110901'',''yyyymmdd''),11,''243dxd'')';
commit;
end;
我的这个过程在test阶段输入表名之后,会弹错,说错误的create命令,有人知道是咋回事么?
我用别人的这个过程就可以完全运行:(下面是别人的可以运行的过程)
create or replace procedure p_train_liuqingsong_dummysql(v_table_name varchar2) is
if_exist number;
begin
execute immediate 'Select count(*) from user_tables where table_name = ''' || upper(v_table_name) || '''' into if_exist;
if if_exist <> 0 then
execute immediate 'drop table ' || v_table_name;
end if;
execute immediate 'create table ' || v_table_name || '
(t1 date,
t2 varchar2(10))'; --步骤一
execute immediate 'alter table ' || v_table_name ||
' add t3 varchar2(10)'; --步骤二
execute immediate 'alter table ' || v_table_name || ' modify t2 number'; --步骤三
execute immediate 'truncate table ' || v_table_name; --步骤四
execute immediate 'insert into ' || v_table_name ||
' values (to_date(''20071212'',''yyyymmdd''),123,''天天'')';
execute immediate 'insert into ' || v_table_name ||
' values (to_date(''20071216'',''yyyymmdd''),456,''地地'')';
commit; --步骤五
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
end
他的过程只是比我的过程多了个exception处理,请问我的为啥不可以谢谢
解决方案 »
- weblogic.kernel.Default (self-tuning) <BEA-101020> weblogic11g一直报错!!!!
- 问个基础的安装问题
- 分布式数据库的一点疑惑
- oracle Expdp命令的 exclude 参数怎么使用
- 求助 : win7 oracle10g 连接不上实例
- 如何通过下面的需求写建表语句
- 如何得到某一张表所点的空间大小?
- TOAD
- 在ORACLE中取最新的数据的前几条,怎么取?象TOP 10用法一样
- help~~~~~~~~~~~,那里有oracle下载,不胜感激.
- 软件外包-Oracle数据库操作(包括连接、存储、查询、状态监控等)
- 请问在ORACLE中是否可以直接读取EXECL文件
execute immediate 'drop table' || v_table_name;
end if;
execute immediate 'create table' || v_table_name ||'
看你的这两句和人家的是一样吗 ? 你的table后面没有空格,这样的语句能执行吗还有把异常处理加上
或者使用pl/sql developer的调试功能单步跟踪一下你拼接的SQL语句是否正确。编程要懂得调试的方法,这是最重要的!!如:
v_sql varchar2(4000);
begin
..................
v_sql :='drop table' || v_table_name;
--打印一下拼接的sql语句
dbms_output.put_line(v_sql);
execute immediate v_sql;
............
end;
如果我在SQL窗口的过程里面写这个命令能让他打印出来么?