上面的Create Table语句出错,该怎么修改?

解决方案 »

  1.   

    动态SQL
    create or replace function test return varchar2 as
        v_cursor number;
        v_string varchar2(200);
        v_row number;
    begin
        v_cursor:=dbms_sql.open_cursor;
        --v_string:='update fnd_user a set a.description=''丁亚军'' where a.user_id=1055';
        v_string:='create table testdb (text varchar2(200))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        return ('成功执行');
        exception
            when others then
                dbms_sql.close_cursor(v_cursor);
                return ('执行失败!'||sqlcode||sqlerrm);
                raise;
    end;
      

  2.   

    dinya2003(dinya 11i)
    ------------------------
    俺现在才知道你的大名是:丁亚军啊。hehe续上面的,问你一个问题:
    在oracle中如何进行字符串连接呢?假设:
    v_string varchar2(500);
     这里v_string 是一个存储过程的参数,这样连接:    v_string:=' Create Table '+TableName+'( TelNo varchar2(20),
         constraint idx_This primary key(TelNo))'; 不对,程序执行到这就发生异常了。怎么改?
      

  3.   

    v_string varchar2(500);    v_string:=' Create Table '+TableName+'( TelNo varchar2(20),
         constraint idx_This primary key(TelNo))';TableName 是一个存储过程的输入参数。
      

  4.   

    v_string:='create table '||tablename||' ...'
      

  5.   

    v_string:=' Create Table ' || TableName ||'( TelNo varchar2(20),constraint idx_This primary key(TelNo))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
    是不是创建的本地表dbms_sql.native? 如果要在服务器上创建表该怎么办?
      

  6.   

    创建表部分使用execute immediate 试试看
      

  7.   


    sql 语句:
       select count(*)  from all_tables a where a.table_name = 'TempCmpTable' ;如果我要查看的表名是一个输入参数,那么这个sql语句怎么写?
    TableName in varchar2(20)
    用:
       select count(*)  from all_tables a where a.table_name = TableName ;好像即使表存在也返回0 ,怎么引用参数呢?
      

  8.   

    freddy2003()create or replace function test return varchar2 as
        v_cursor number;
        v_string varchar2(200);
        v_row number;
    begin
        v_cursor:=dbms_sql.open_cursor;
        --v_string:='update fnd_user a set a.description=''丁亚军'' where a.user_id=1055';
        v_string:='create table testdb (text varchar2(200))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        return ('成功执行');
        exception
            when others then
                dbms_sql.close_cursor(v_cursor);
                return ('执行失败!'||sqlcode||sqlerrm);
                raise;
    end;
    ------------------------------------
    晕,我使用你上面的方法新建表,怎么总是建立不了?你自己可以测试一下吗?但是截断表禾删除表用你上面的方法却可以的。
      

  9.   

    --输入参数使用:
    select count(*)  from all_tables a where a.table_name :=TableName;
    --你给int型变量赋值直接: RetValue=1; 
    --创建表部分使用execute immediate 'create table......';
      

  10.   

    问题解决!下面奉献我的完整存储过程代码给大家!
    存储过程功能:判断一个表是否存在,如果不存在就新建表;如果存在,就先截断表,然后删除表,最后新建一个表。CREATE OR REPLACE PROCEDURE ExCreate
    (
     TableName varchar2,
     RetValue out int
    )
    as
     i int;
        v_cursor number;
        v_string varchar2(500);
        v_row number; 
    begin
       select count(*) into i from all_tables a where a.table_name = TableName ;
       if i=0 then 
        begin
        RetValue:=1; 
        
        /*  ---这个创建也可以
          execute immediate 'create table testdbex (text varchar2(200))';
         -- commit;  */
        /*  -- 这样创建也可以
        v_cursor:=dbms_sql.open_cursor;
        v_string:='create table testdb (text varchar2(200))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);  */
        
        -- 我的程序中是这样创建的
        v_cursor:=dbms_sql.open_cursor;
        --v_string:=' Create Table ' || TableName ||' ( TelNo varchar2(20),constraint idx_This_ex primary key(TelNo))';
        v_string := 'Create Table TempCmpTable( TelNo varchar2(20),constraint idx_number primary key(TelNo))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        
        RetValue :=100;
         end;
       else
        begin
         RetValue:=2;
         
        v_cursor:=dbms_sql.open_cursor;
        v_string:='truncate table ' || TableName;--||';';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);         RetValue :=3;
              
        v_cursor:=dbms_sql.open_cursor;
        v_string:=' drop table ' || TableName;--|| ';';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);          RetValue :=4;
         
        v_cursor:=dbms_sql.open_cursor;
        v_string:='Create Table ' || TableName ||' 
         ( TelNo varchar2(20),
         constraint idx_number primary key(TelNo)) ';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);          
         
         
         RetValue:=200;
        end;
       end if;
       exception  when others 
        then 
          RetValue:=-2500;
    end;
    有一个非常关键的问题是,你必须清楚:你登录到oracle数据库上的用户有没有创建表的权限? 如果没有,那么执行创建表即使你的其它的都是对的,也会出现异常而不能创建新表。因此:你必须在登录到oracle数据库服务器,PL/SQL执行 :
    Grant Create Table To YourUserName // 授予权限给用户:YourUserName