JDBC 및 ODBC를 사용하여 Informix 데이터베이스에 텍스트 열을 삽입하는 일관된 메소드

StackOverflow https://stackoverflow.com/questions/483284

  •  20-08-2019
  •  | 
  •  

문제

JDBC를 통해 텍스트 열을 Informix 텍스트 열에 삽입 할 때 문제가 있습니다. ODBC에서는 다음과 같이 SQL을 실행할 수 있습니다.

INSERT INTO test_table (text_column) VALUES ('insert')

그러나 이것은 JDBC에서 작동하지 않으며 오류가 발생했습니다.

617: A blob data type must be supplied within this context.

그런 문제를 검색하고 2003 년부터 메시지를 찾았습니다.

http://groups.google.com/group/comp.databases.informix/browse_thread/thread/4dab38472e521269?ie=utf-8&oe=utf-8&q=informix+JDBC++BBLOB+Data+Must+Must+ +이%내에서+제공+

ProadingStatement를 사용하도록 코드를 변경했습니다. 이제 JDBC와 함께 작동하지만 ODBC에서는 준비 상태를 사용하려고 시도 할 때 오류가 발생했습니다.

Error: [Informix][Informix ODBC Driver][Informix]
Illegal attempt to convert Text/Byte blob type.
[SQLCode: -608], [SQLState: S1000]

테스트 테이블은 다음과 함께 생성되었습니다.

CREATE TABLE _text_test (id serial PRIMARY KEY, txt TEXT)

두 드라이버를 테스트하기위한 Jython 코드 :

# for Jython 2.5 invoke with --verify
# beacuse of bug: http://bugs.jython.org/issue1127

import traceback
import sys
from com.ziclix.python.sql import zxJDBC

def test_text(driver, db_url, usr, passwd):
    arr = db_url.split(':', 2)
    dbname = arr[1]
    if dbname == 'odbc':
        dbname = db_url
    print "\n\n%s\n--------------" % (dbname)
    try:
        connection = zxJDBC.connect(db_url, usr, passwd, driver)
    except:
        ex = sys.exc_info()
        s = 'Exception: %s: %s\n%s' % (ex[0], ex[1], db_url)
        print s
        return
    Errors = []
    try:
        cursor = connection.cursor()
        cursor.execute("DELETE FROM _text_test")
        try:
            cursor.execute("INSERT INTO _text_test (txt) VALUES (?)", ['prepared', ])
            print "prepared insert ok"
        except:
            ex = sys.exc_info()
            s = 'Exception in prepared insert: %s: %s\n%s\n' % (ex[0], ex[1], traceback.format_exc())
            Errors.append(s)
        try:
            cursor.execute("INSERT INTO _text_test (txt) VALUES ('normal')")
            print "insert ok"
        except:
            ex = sys.exc_info()
            s = 'Exception in insert: %s: %s\n%s' % (ex[0], ex[1], traceback.format_exc())
            Errors.append(s)
        cursor.execute("SELECT id, txt FROM _text_test")
        print "\nData:"
        for row in cursor.fetchall():
            print '[%s]\t[%s]' % (row[0], row[1])
        if Errors:
            print "\nErrors:"
            print "\n".join(Errors)
    finally:
        cursor.close()
        connection.commit()
        connection.close()


#test_varchar(driver, db_url, usr, passwd)
test_text("sun.jdbc.odbc.JdbcOdbcDriver", 'jdbc:odbc:test_db', 'usr', 'passwd')
test_text("com.informix.jdbc.IfxDriver", 'jdbc:informix-sqli://169.0.1.225:9088/test_db:informixserver=ol_225;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'usr', 'passwd')

JDBC 또는 ODBC에 두 드라이버 모두에 대해 하나의 버전의 코드가있는 설정이 있습니까?

버전 정보 :

  • 서버 : IBM Informix Dynamic Server 버전 11.50.tc2de
  • 고객:
    • ODBC 드라이버 3.50.tc3de
    • IBM Informix JDBC IBM Informix Dynamic Server 3.50.jc3de 용 IBM Informix JDBC 드라이버
도움이 되었습니까?

해결책

우선, 정보 텍스트 유형을 사용하고 싶습니까? 이 유형은 부분적으로 당신이 직면 한 문제로 인해 사용하기가 귀찮습니다. 대형 물체와 관련하여 모든 SQL 표준의 모든 것을 사전 데이트합니다 (텍스트는 여전히 SQL-2003에 있지 않지만 대략 동등한 구조, 클로브 및 블로브입니다). 그리고 바이트와 텍스트 블로브의 기능은 1996 년과 같이 1996 년과 같은 이전 날짜를 선택한 경우가 있다고 생각하지만 1996 년 이후로 변경되지 않았습니다.

특히 텍스트 열에 얼마나 많은 데이터를 저장할 계획입니까? 예제는 문자열 '삽입'을 보여줍니다. 즉, 나는 당신이 실제로 사용하는 것보다 훨씬 작습니다. 바이트 또는 텍스트 열은 테이블의 56 바이트 디스크립터와 별도의 페이지 (또는 페이지 세트)를 사용하여 실제 데이터를 저장합니다. 따라서 작은 문자열의 경우 공간과 대역폭 낭비입니다 (바이트 또는 텍스트 개체의 데이터는 클라이언트와 서버간에 나머지 행과 별도로 배송되기 때문에). 크기가 약 32kb 이상이되지 않으면 텍스트 대신 lvarchar를 사용하는 것을 살펴 봐야합니다. 그 위의 데이터 크기를 사용하는 경우 바이트 또는 텍스트 또는 블로브 또는 클로브는 합리적인 대안이지만 Blob 공간 (바이트 또는 텍스트의 경우) 또는 스마트 블로브 공간 (Blob 또는 Clob)을 구성하는 것을 살펴 봐야합니다. 당신은 블로브 공간이 아닌 텍스트를 테이블에 사용할 수 있습니다. 그렇게하는 것은 논리적 로그에 영향을 미치는 반면 Blob Space를 사용하는 것은 그것들과 같은 것에 영향을 미치지 않습니다.

내가 10 년 정도 캠페인을해온 기능 중 하나는 SQL 문으로 문자 리터럴을 텍스트 리터럴 (또는 바이트 리터럴)으로 전달하는 기능입니다. 그것은 부분적으로 당신과 같은 사람들의 경험 때문입니다. 나는 아직 다른 변화보다 우선 순위를 정하는 데 성공하지 못했습니다. 물론 SQL 문의 최대 크기는 64kb 텍스트라는 것을 알고 있어야하므로 조심하지 않으면 너무 큰 SQL 문을 만들 수 있습니다. SQL의 자리 표시 자 (물음표)는 일반적으로 문제가되는 것을 방지합니다. SQL 문의 크기를 늘리는 것은 내가 캠페인을 해왔 던 또 다른 기능 요청이지만 약간 덜 열렬합니다.

좋아, 텍스트를 사용해야 할 이유가 있다고 가정합니다 ... 다음에. Java (JDBC 드라이버)가 장면 뒤에서 무엇을하고 있는지 명확하지 않습니다. 체재. ODBC 드라이버는 비슷한 샤니 건에 빠지지 않는 것 같습니다.

일반적으로 작동하는 ESQL/C에서는 코드가 바이트와 다른 모든 것과 다르게 텍스트를 다루어야합니다 (Blob 및 Clob은 다르게 다루어야합니다). 그러나 Locator 구조 (Locator.h에서 loc_t 또는 ifx_loc_t- ODBC 디렉토리에 없을 수도 있고 기본적으로 $ informixdir/incl/esql)를 만들고 ESQL/C 코드로 전달할 수 있습니다. SQL 문의 관련 자리 표시 자의 호스트 변수. 원칙적으로 ODBC에 사용할 수있는 병렬 방법이있을 수 있습니다. 그러나 정보를 찾으려면 Informix ODBC 드라이버 매뉴얼을 살펴 봐야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top