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值都不会变化了。为什么会这样?请各位赐教,谢谢!
... ...
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值都不会变化了。为什么会这样?请各位赐教,谢谢!
解决方案 »
- oracle一次插入多条数据报错,求解???
- 我在tomcat里设置了一个调度任务,每隔一段时间建立一个和数据库的连接读值,然后关闭连接。但是过一会连接数就满了?
- 求opatch升级包!!!
- 我是刚刚学习oracle的,问几个简单的问提?--------------
- 数据库连接问题!
- 哪位能给些oracle9i的资料?
- Oracle9i Application Server Release 2 (9.0.3) for WIN2000的安装问题
- 請問要怎麼可以把高版本的.dmp文件導入低版本的數據庫系統裡?
- 求Oracle大神想想办法
- oracle11g创建2个oracle实例,只能访问其中一个,求解!
- 怎么样能得到异常抛出的位置。【急急急】
- pl/sql中 select into 变量 --该变量是否可以是数组或相当于数组
一般的是字母,数字占1个,汉字占2个你循环不变的时候,select lengthb(你的sql) from dual 看下是多长,应该已经到4000了
你看980是怎么看的了,不过也不应该到980就存不下去,
这样应该够用了
保存你的sql文应该够了
10g以前的话,有长度限制。LZ怎么确认长度的呢?
我就把你的句子COPY下来,也有1070BYTE了。赫赫。