现在有这么个需求:
输入表名变量,如果表名不存在,则直接建表,否则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处理,请问我的为啥不可以谢谢

解决方案 »

  1.   

    if exsist_table <> 0 then
      execute immediate 'drop table' || v_table_name;
      end if;
      execute immediate 'create table' || v_table_name ||'
    看你的这两句和人家的是一样吗 ? 你的table后面没有空格,这样的语句能执行吗还有把异常处理加上
      

  2.   

    你可以把你的sql串 先声明一个变量保存起来,在执行前打印出来看一下,是否与你预期相同
    或者使用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;
      

  3.   

    dbms_output.put_line()是打印命令。但是为啥我写这个命令而无法将结果打印出来?我是要在command窗口运行这个?还是普通的SQL窗口就可以了?
    如果我在SQL窗口的过程里面写这个命令能让他打印出来么?
      

  4.   

    不要打印了。直接用pl/sql进行单步调试,如果不会这个的话,调试存储过程是一件相当痛苦的事情,在plsql中直接选中存储过程,点击右键,给该过程加调试信息好像是 add debuginfo 然后选中存储过程,点击右键选中Test调试,然后进入到调试界面,一般一般走下去,可以得到任何一个参数的值,哪一句执行报错也一眼就能看出来建议你把这个过程一定要学会
      

  5.   

      sql窗体运行, 只是输出显示一下~