我想通过java调用动态创建数据表的存储过程,存储过程接收多个参数,如:参数1,表名,参数colum1,等
然后调用存储过程创建该表

解决方案 »

  1.   


    ---expsb.append("{call ")
                  .append("getProcedureName(?,?,?,?,?,?,?,?)}");
                
                csmt = conn.prepareCall(sb.toString());
                csmt.setTimestamp(1,comValue.getBeginDate());
                csmt.setTimestamp(2,comValue.getEndDate());
                csmt.setString(3,deptId);
                csmt.setString(4,operId);
                csmt.setString(5,status);
                csmt.registerOutParameter(6,Types.INTEGER);
                csmt.registerOutParameter(7,Types.VARCHAR);
                csmt.registerOutParameter(8,OracleTypes.CURSOR);            csmt.execute();
      

  2.   

    基本上就是拼接创建表结构的sql语句,最后execute immediate执行
      

  3.   

    CREATE OR REPLACE PROCEDURE TEST 
    (t_name in varchar2)
    Authid Current_User 
    IS
    str VARCHAR2(500);
    v_Cursor NUMBER;BEGIN
       str := 'CREATE TABLE ' || t_name || '(u_name varchar2(20) not null,p_wd varchar2(20) not null)';   v_Cursor := DBMS_SQL.OPEN_CURSOR;
       DBMS_SQL.PARSE(v_Cursor,str,DBMS_SQL.NATIVE);
       DBMS_SQL.CLOSE_CURSOR(v_Cursor);END TEST;
      

  4.   

    想让大家,再以上的test存储过程中给加上判断表是否存在
      

  5.   

    CREATE OR REPLACE PROCEDURE TEST 
    (t_name in varchar2)
    Authid Current_User 
    IS
    str VARCHAR2(500);
    v_Cursor NUMBER;
    exist int;BEGIN   select count(*) into exist from USER_TABLES where TABLE_NAME= t_name; 
       
       if ( exist > 0 ) then
       execute immediate 'drop table ' || t_name;
       end if;
    execute immediate 'CREATE TABLE ' || t_name || '(u_name varchar2(20) not null,p_wd varchar2(20) not null)';
    END TEST;
      

  6.   

    终于算是差不多了,下面是最新的procedure
    CREATE OR REPLACE PROCEDURE MHT_OFM01_PROC
    (t_name in varchar2,d_time varchar2,
    StationCode varchar2,InstrumentID varchar2,
    SamplingRate varchar2,Channel varchar2,F_ComponentCode varchar2
    )
    Authid Current_User
    IS
    exist int;BEGINselect count(*) into exist from user_tables where table_name = t_name ;if ( exist > 0 ) then
          execute immediate 'insert into '
          || t_name || ' values(0,'
          || d_time || ',' || StationCode || ','
          || InstrumentID || ',' || SamplingRate || ','
          || Channel || ',' || F_ComponentCode || ')';
    else
          execute immediate 'create table ' || t_name ||
          '(id int not null primary key,d_time varchar2(20) not null,StationCode varchar2(20) not null,
          InstrumentID varchar2(20) not null,SamplingRate varchar2(20)  not null,
          Channel varchar2(20)  not null,F_ComponentCode varchar2(20)  not null)';      execute immediate 'create index INDEX_MHT_OFM01 on ' || t_name || '(id,d_time)' ;
          execute immediate 'create sequence SEQ_MHT_OFM01_ID';
          execute immediate 'create or replace trigger TRG_MHT_OFM01_ID before insert on ' || t_name ||
           ' for each row begin
    select SEQ_MHT_OFM01_ID.nextval into :new.id from dual;
       end;';end if;commit;
    EXCEPTION
       WHEN OTHERS
       THEN
          ROLLBACK;END MHT_OFM01_PROC;
    /