2012-10-31 29 views
0

我有兩個相同的表結構HSQLDB導入文本表格文件轉換成傳統的表

  1. 緩存表(normaltable)
  2. 文本表(textfiletable)

我想複製從表[2]的數據在表[1]

我使用該插入語法

INSERT INTO normaltable ("COL1", "COL2", "COL3") 
SELECT COL1, COL2, COL3 
FROM textfiletable; 

我利用另一插入語句

SELECT COL1, COL2, COL3 
INTO normaltable 
FROM textfiletable; 

時出現此錯誤

data exception:string data, right truncation/Error code: -3401/state: 22001 

我得到這個錯誤

unexpected token : INTO required: FROM:line:2/error code: -5581/state:42581 

任何人可以解釋一下嗎?


即時更新我的​​劇本的細節,供你參考:

drop table pis_mdc; 
drop table normaltable; 
drop table textfiletable; 

--- original table 
CREATE TABLE PIS_MDC 
(UD_MDC_CODE VARCHAR(25) , 
DRUG_GNR_NAME VARCHAR(200)DEFAULT 'NULL', 
DRUG_PRODUCT_NAME VARCHAR(100), 
UD_MDC_DESC VARCHAR(200)DEFAULT 'NULL', 
ACTIVE_INGREDIENT_CODE VARCHAR(600), 
DEF_CAUTIONARY_CODE VARCHAR(200), 
DOSAGE_FORM_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_DOSAGE VARCHAR(20), 
DEF_ROUTE_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_ADVISORY_CODE VARCHAR(200)DEFAULT 'NULL', 
UD_ATC_CODE VARCHAR(15) , 
STATUS VARCHAR(20), 
DRUG_STRENGTH VARCHAR(20), 
PRIMARY KEY(UD_MDC_CODE,UD_ATC_CODE)); 

--create cached tbl 
create cached table normaltable 
(UD_MDC_CODE VARCHAR(25) , 
DRUG_GNR_NAME VARCHAR(100)DEFAULT 'NULL', 
DRUG_PRODUCT_NAME VARCHAR(200), 
UD_MDC_DESC VARCHAR(200)DEFAULT 'NULL', 
ACTIVE_INGREDIENT_CODE VARCHAR(600), 
DEF_CAUTIONARY_CODE VARCHAR(200), 
DOSAGE_FORM_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_DOSAGE VARCHAR (20), 
DEF_ROUTE_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_ADVISORY_CODE VARCHAR(200)DEFAULT 'NULL', 
UD_ATC_CODE VARCHAR(15) , 
STATUS VARCHAR(20), 
DRUG_STRENGTH VARCHAR(20)); 

--create the table that table 
create text table textfiletable 
(UD_MDC_CODE VARCHAR(25) , 
DRUG_GNR_NAME VARCHAR(100)DEFAULT 'NULL', 
DRUG_PRODUCT_NAME VARCHAR(200), 
UD_MDC_DESC VARCHAR(200)DEFAULT 'NULL', 
ACTIVE_INGREDIENT_CODE VARCHAR(600), 
DEF_CAUTIONARY_CODE VARCHAR(200), 
DOSAGE_FORM_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_DOSAGE VARCHAR (20), 
DEF_ROUTE_CODE VARCHAR(100)DEFAULT 'NULL', 
DEF_ADVISORY_CODE VARCHAR(200)DEFAULT 'NULL', 
UD_ATC_CODE VARCHAR(15) , 
STATUS VARCHAR(20), 
DRUG_STRENGTH VARCHAR(20)); 


--SET TABLE textfiletable SOURCE ON 

SET TABLE textfiletable SOURCE "gabung.csv;ignore_first=true" 

--OPTION 0 line 1 with quotes without MAX(CHAR_LENGTH()) 
INSERT INTO normaltable ("UD_MDC_CODE","DRUG_GNR_NAME","DRUG_PRODUCT_NAME","UD_MDC_DESC","ACTIVE_INGREDIENT_CODE","DEF_CAUTIONARY_CODE","DOSAGE_FORM_CODE","DEF_DOSAGE","DEF_ROUTE_CODE","DEF_ADVISORY_CODE","UD_ATC_CODE","STATUS","DRUG_STRENGTH") 
select UD_MDC_CODE,DRUG_GNR_NAME,DRUG_PRODUCT_NAME,UD_MDC_DESC,ACTIVE_INGREDIENT_CODE,DEF_CAUTIONARY_CODE,DOSAGE_FORM_CODE,DEF_DOSAGE,DEF_ROUTE_CODE,DEF_ADVISORY_CODE,UD_ATC_CODE,STATUS,DRUG_STRENGTH 
from textfiletable; 

-- OPTION 1 line 1 without quotes 
--SELECT MAX(CHAR_LENGTH(COL1)), MAX(CHAR_LENGTH(COL2)), ... FROM textfiletable 
--INSERT INTO normaltable ("UD_MDC_CODE","DRUG_GNR_NAME","DRUG_PRODUCT_NAME","UD_MDC_DESC","ACTIVE_INGREDIENT_CODE","DEF_CAUTIONARY_CODE","DOSAGE_FORM_CODE","DEF_DOSAGE","DEF_ROUTE_CODE","DEF_ADVISORY_CODE","UD_ATC_CODE","STATUS","DRUG_STRENGTH") 
INSERT INTO normaltable (UD_MDC_CODE,DRUG_GNR_NAME,DRUG_PRODUCT_NAME,UD_MDC_DESC,ACTIVE_INGREDIENT_CODE,DEF_CAUTIONARY_CODE,DOSAGE_FORM_CODE,DEF_DOSAGE,DEF_ROUTE_CODE,DEF_ADVISORY_CODE,UD_ATC_CODE,STATUS,DRUG_STRENGTH) 
SELECT MAX(CHAR_LENGTH(UD_MDC_CODE)),MAX(CHAR_LENGTH(DRUG_GNR_NAME)),MAX(CHAR_LENGTH(DRUG_PRODUCT_NAME)),MAX(CHAR_LENGTH(UD_MDC_DESC)),MAX(CHAR_LENGTH(ACTIVE_INGREDIENT_CODE)),MAX(CHAR_LENGTH(DEF_CAUTIONARY_CODE)),MAX(CHAR_LENGTH(DOSAGE_FORM_CODE)),MAX(CHAR_LENGTH(DEF_DOSAGE)),MAX(CHAR_LENGTH(DEF_ROUTE_CODE)),MAX(CHAR_LENGTH(DEF_ADVISORY_CODE)),MAX(CHAR_LENGTH(UD_ATC_CODE)),MAX(CHAR_LENGTH(STATUS)),MAX(CHAR_LENGTH(DRUG_STRENGTH)) 
FROM textfiletable 
--ORDER BY UD_MDC_CODE DESC; 

--we are done with the text file table 
DROP TABLE textfiletable; 
COMMIT; 

從textfiletable是想複製數據的示例列表/插入結果normaltable https://docs.google.com/open?id=0B-7fkDVcLbxnclBZZDZRQWg4ZEE

例子使用max(char_length(col_name)) https://docs.google.com/open?id=0B-7fkDVcLbxnREpzNUp3d3NNSlE

回答

0

unexpected token錯誤是語法錯誤。這意味着該語法在版本2.x中不受支持。

data exception錯誤表示存儲在TEXT表中的某些字符串太大而無法插入CACHED表中的字段。嘗試查詢,如:

SELECT MAX(CHAR_LENGTH(UD_MDC_CODE)), MAX(CHAR_LENGTH(DRUG_GNR_NAME)), MAX(CHAR_LENGTH(DRUG_PRODUCT_NAME)) FROM textfiletable 

看看結果和最大長度與normaltable的列大小比較。例如,如果UD_MDC_CODE的MAX值是29,那麼你必須使這個列變大。這可以使用這個聲明,更改列的大小30來完成:

ALTER TABLE normaltable ALTER COLUMN UD_MDC_CODE SET DATA TYPE VARCHAR(30) 

使用ALTER TABLE語句僅適用於具有比最高值的大小更小的列。如果對所有太小的列執行此操作,請使用INSERT INTO語句將TEXT表中的數據複製到CACHED表。 ALTER TABLE語句記錄在這裏:

http://hsqldb.org/doc/2.0/guide/databaseobjects-chapt.html#dbc_table_manupulation

+0

感謝replyin,但我已經從** VARCHAR更改表中的數據類型LONGVARCHAR ** 仍然沒有聚集或GROUP BY列表達的'它報錯:PUBLIC.TEXTFILETABLE.UD_MDC_CODE /錯誤代碼:-5574 /狀態:42574'設置MAX後(CHAR_L ..)' –

+0

我編輯了SELECT示例。只需將您的列名稱代替COL1,CLO2和COL3,它就可以工作。 – fredt

+0

這是否意味着我必須在每一列使用MAX(CHAR_LENGTH(COL))'? –

相關問題