oracle中,设定varchar2长度为4000,(最大只能存4000),为什么存到980就不行了??---主要功能:就是从配置表中读取字段名、类型以及长度,创建新数据库表,同时建立分区表
... ...
v_sql varchar2(4000);
begin
            --创建数据库表
            v_sql := 'create table '||v_bak_tab_name||' (';      --从配置表中读取新库表所需的字段名、类型以及长度 (这个新建表有145个字段,v_sql 绝对会超过2000字符)
            v_sql_cur := 'select COLUMN_NAME,DATA_TYPE,column_id,DATA_LENGTH
                          from '||i_tab_struct_bak
                         ||' where owner='||''''||i_tab_owner||''''
                         ||' and table_name='||''''||i_tab_name||''''
                         ||' order by column_id';
            open all_tab_cols_cur for v_sql_cur;
            loop              
                FETCH all_tab_cols_cur INTO v_col_name,v_data_type,n_column_id,n_data_length;
                EXIT WHEN all_tab_cols_cur%NOTFOUND;
                v_sql := v_sql || v_col_name || ' ' || v_data_type;-----(1)                if n_data_length is not null then
                    v_sql := v_sql || '(' ||n_data_length|| ')';
                end if;
                v_sql := v_sql||',';
            end loop;
            close all_tab_cols_cur;            --在创建分区表时,同时把当前日期的分区表也创建,故把上句修改成如下语句:            
            v_sql := v_sql ||'bak_date date)
                     partition by range(bak_date)
                     (            
                         PARTITION '|| v_tab_part_name||' VALUES LESS THAN (to_date('''||to_char(sysdate+1,'YYYYMMDD')||''','''||'YYYYMMDD'||''')),
               ' ||' partition P00 values less than(MAXVALUE))';
           execute immediate v_sql;   
end
... ...
当loop循环至第42个字段时,其v_sql ='create table TD_VIP_MEMBERINFO_A (VIP_ID VARCHAR2(20),SERV_ID NUMBER(22),GROUP_VIP_ID VARCHAR2(20),NAME VARCHAR2(60),SEX VARCHAR2(1),MOBILE_NUM VARCHAR2(12),CASH_SERIES_ID VARCHAR2(5),CUST_STATUS_ID VARCHAR2(3),INNET_DATE DATE(7),COUNTRY_ID VARCHAR2(5),AREA_ID VARCHAR2(3),BIRTHDAY DATE(7),CALENDAR_TYPE VARCHAR2(1),WORK_UNIT VARCHAR2(60),WORK_DEPART VARCHAR2(20),DUTY_ID VARCHAR2(3),MARRY_STATUS_ID VARCHAR2(1),EDUCAT_DEGREE_ID VARCHAR2(3),INCOME_LEVEL_ID VARCHAR2(3),BILL_POST_ADDR VARCHAR2(80),VIP_TYPE_ID VARCHAR2(1),LEVEL_ID VARCHAR2(3),IMPORT_ID VARCHAR2(1),GRADE NUMBER(22),SUM_FEE NUMBER(22),CREDIT NUMBER(22),VIP_NUM VARCHAR2(20),CUST_ACCT VARCHAR2(20),COST_PERMONTH NUMBER(22),CLUB_ID VARCHAR2(3),LIKE_ADDFUNC VARCHAR2(60),INTEREST VARCHAR2(60),MGR_DEPT_ID VARCHAR2(7),MGR_STAFF_ID VARCHAR2(3),SHORT_NUM VARCHAR2(15),BOOK_IN_DATE DATE(7),REFRESH_DATE DATE(7),ASSESS_DATE DATE(7),DEPT_ID VARCHAR2(7),STAFF_ID VARCHAR2(3),CHANGE_ID VARCHAR2(2),HOLD_TEL_NAME VARCHAR2(60),'可读取到第43个字段时,其s_sql='select to_char(sysdate,'MM'),to_char(sysdate,'DD'),to_char(sysdate,'HH24'),to_char(sysdate,'MI'),decode(upper(substr(to_char(sysdate,'day'),1,3)),'MON','01','TUE','02','WED','03','THU','04','FRI','05','SAT','06','SUN','0','-1') from dual'  (这个语句,是在刚进入此存储过程中时就已定义的),之后不管循环多少次直至145个字段全部读取完毕,其s_sql值都不会变化了。为什么会这样?请各位赐教,谢谢!

解决方案 »

  1.   

    4000是指的字节(好象是吧)
    一般的是字母,数字占1个,汉字占2个你循环不变的时候,select lengthb(你的sql) from dual  看下是多长,应该已经到4000了
    你看980是怎么看的了,不过也不应该到980就存不下去,
      

  2.   

    varchar2(4000) 是4000 bytes 即字节而非字符
      

  3.   

    晕,这CSDN是怎么回事呀,俺刚查还没人回,俺一写完提交就这么多啦?
      

  4.   

    象这样的东西,完全可以定义varchar(32676)
    这样应该够用了
      

  5.   

    写错了,应该是varchar2(32676)
    保存你的sql文应该够了
      

  6.   

    10g的版本,对可以执行的SQL没有限制。
    10g以前的话,有长度限制。LZ怎么确认长度的呢?
    我就把你的句子COPY下来,也有1070BYTE了。赫赫。