java.sql.SQLExceptionを:: ORA-00923:キーワードから要求がエラーSQL、Javaコードの実行を見つかりませんでした

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_41885819/article/details/100540762

最近、データベースの同期インタフェースの特に多数を書いた、あなたはプログラムのJavaのSQL大きなセグメントにスプライスする必要があり、その後、エグゼクティブに提出し、何回ORA-00923のエラー、少しお世辞がありました。

たとえば、次のコードは、実行db.execute(insertSqlは)確かにこのエラーを報告します。

@Override
public int doInsert(DB db,InterfaceLogBean logBean) {
	StringBuilder insertBuilder = new StringBuilder();
	insertBuilder.append("INSERT INTO ");
	insertBuilder.append("MTL_ONHAND_QUANTITIES_DETAIL ");
	insertBuilder.append("(INVENTORY_ITEM_ID,ITEM_CODE,ORGANIZATION_ID,DATE_RECEIVED,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY,");
	insertBuilder.append("PRIMARY_TRANSACTION_QUANTITY,SUBINVENTORY_CODE,LOT_NUMBER,ONHAND_QUANTITIES_ID,ORGANIZATION_TYPE,");
	insertBuilder.append(" OWNING_ORGANIZATION_ID,TRANSACTION_UOM_CODE,TRANSACTION_QUANTITY,IS_CONSIGNED)");
	insertBuilder.append("SELECT INVENTORY_ITEM_ID,ITEM_CODE,84,DATE_RECEIVED,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY, ");	
	insertBuilder.append("PRIMARY_TRANSACTION_QUANTITY,SUBINVENTORY_CODE,LOT_NUMBER,ONHAND_QUANTITIES_ID,ORGANIZATION_TYPE,");
	insertBuilder.append("OWNING_ORGANIZATION_ID,TRANSACTION_UOM_CODE,TRANSACTION_QUANTITY,IS_CONSIGNED");
	insertBuilder.append("FROM MTL_ONHAND_QUANTITIES_TEMP MOQT ");
	insertBuilder.append("WHERE 1=1 AND NOT EXISTS(SELECT 1 FROM MTL_ONHAND_QUANTITIES_DETAIL MOQD WHERE 1=1 AND MOQD.ONHAND_QUANTITIES_ID = MOQT.ONHAND_QUANTITIES_ID)");
	String insertSql = insertBuilder.toString();
	insertBuilder.delete(0, insertBuilder.length());
	try {
			return db.execute(insertSql);
		} catch (JDBCException e) {
			e.printStackTrace();
			logBean.setExceptContent(e.getMessage());
			return -1;
		} catch (Exception e) {
			e.printStackTrace();
			logBean.setExceptContent(e.getMessage());
			return -1;
		}
	}

あなたは時間があれば、あなたはDEBUGを見ることができ、insertSqlの実行が有効になる前に、その後、PLSQLにコピーし、このSQLは、問題がどこにあるあなたが知っていることを実行します。
その理由は単純で、ステッチは、SQLスペースやそこから二番目の背後のスペースの外に滞在する必要があると付け加えている何の改行、ではありませんので、それは、一緒に作品FROM IS_CONSIGNEDと背面をバックアップしませんがありません。この場合スペース、insertSqlは自然からキーワードを見つけることができない、IS_CONSIGNEDFROMに表示されます。
さらに別の方法は、各セグメントをラップする文字列の各部分「\ n」は文字列形式スプライシングと共にバックスプライスされるべきです。

  • の例
	public static void main(String[] args) {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("SELECT ID,NAME,AGE");
		stringBuilder.append("FROM STUDENT");
		System.out.println(stringBuilder.toString());
		//输出内容为:SELECT ID,NAME,AGEFROM STUDENT
		//会报错ORA-00923
	}
  • 例二
	public static void main(String[] args) {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("SELECT ID,NAME,AGE\n");
		stringBuilder.append("FROM STUDENT\n");
		System.out.println(stringBuilder.toString());
		/**
		符合要求
		输出内容为:
		SELECT ID,NAME,AGE
		FROM STUDENT		
		*/
	}
  • 三つの例
	public static void main(String[] args) {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("SELECT ID,NAME,AGE ");
		stringBuilder.append("FROM STUDENT");
		System.out.println(stringBuilder.toString());
		/**
		符合要求
		输出内容为:
		SELECT ID,NAME,AGE FROM STUDENT
		*/
	}

おすすめ

転載: blog.csdn.net/qq_41885819/article/details/100540762