2

検索しましたが、探しているものがまったく見つからないようです。Oracle で PL/SQL スクリプトを実行しており、MySQL ODBC 5.2 Unicode Driver を使用してデータベース リンク経由で MySQL のテーブルにレコードを挿入しようとしています。

リンクは正常に機能し、それを使用してOracleで複雑なクエリを実行し、そこでレコードに対してさまざまな挿入と更新を行うことができます.

失敗するのは、bit(1) 型のカラムを持つ MySQL テーブルにレコードを挿入しようとした場合です。

これは基本的にカーソル for ループであり、insert ステートメントは次のようになります。

INSERT INTO "app_user"@mobileapi (USERNAME, VERSION, ACCOUNT_EXPIRED, ACCOUNT_LOCKED, PASSWD, PASSWORD_EXPIRED)
VALUES  (CU_rec.USERNAME, CU_rec.VERSION, CU_rec.ACCOUNT_EXPIRED, CU_rec.ACCOUNT_LOCKED, CU_rec.PASSWD, CU_rec.PASSWORD_EXPIRED)

、 などのターゲット列の一部は、MySQL のACCOUNT_EXPIRED列です。カーソル内のデータ型をOracle で必要なほぼすべてのデータ型に変換できるとすれば、それらをターゲットに挿入するにはどうすればよいでしょうか? 考えられることはすべて試しましたが、次のようになりました。ACCOUNT_LOCKEDbit(1)CU_rec

エラーレポート:

ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[MySQL][ODBC 5.2(w) Driver][mysqld-5.6.10]Data too long for column 'ACCOUNT_EXPIRED' at row 1 {HY000,NativeErr = 1406}
ORA-02063: preceding 2 lines from MOBILEAPI
ORA-06512: at line 44
28500. 00000 -  "connection from ORACLE to a non-Oracle system returned this message:"
*Cause:    The cause is explained in the forwarded message.
*Action:   See the non-Oracle system's documentation of the forwarded
           message.

どんな助けでも大歓迎です。

4

2 に答える 2

0

ハッ!解決策を見つけました。他の誰かに役立つ場合に備えて、ここにドロップします。きれいではありませんが、機能します。

古いEXECUTE IMMEDIATEトリックを使用しました。

基本的に、変数を作成し、次のsql_stmt varchar2(4000)ようなコードを書きました。

sql_stmt := 'insert into "app_user"@mobileapi (USERNAME, VERSION, ACCOUNT_EXPIRED, ACCOUNT_LOCKED, CIPHER_PASSPHRASE, ENABLED, PASSWD, PASSWORD_EXPIRED) 
values ('''||CU_rec.USERNAME||'','||CU_rec.VERSION||', '||CU_rec.ACCOUNT_EXPIRED||', '||CU_rec.ACCOUNT_LOCKED||', '''||CU_rec.CIPHER_PASSPHRASE||''', '|| 
           CU_rec.ENABLED||', '''||CU_rec.PASSWD||''', '||CU_rec.PASSWORD_EXPIRED||')';
EXECUTE IMMEDIATE sql_stmt;

とにかくそのようなものです(実際のコードから少しハッキングしたため、引用符が一致しない場合があります)。sql_stmt の内容を見ると、次のようになります。

insert into "app_user"@mobileapi (USERNAME, VERSION, ACCOUNT_EXPIRED, ACCOUNT_LOCKED, CIPHER_PASSPHRASE, ENABLED, PASSWD,PASSWORD_EXPIRED) 
values ('user@email.com', 0, 0, 0, 'asdfastrwaebawavgansdhnsgjsjsh', 1, 'awercbcakwjerhcawuerawieubkahbewvkruh', 0)

EXECUTE IMMEDIATE が完了し、ターゲット テーブルをチェックすると、値が存在します。

おそらくくだらない解決策ですが、何もしないよりはましです。

于 2013-05-27T23:03:02.773 に答える