0

以下は、Oracle接続文字列を使用してC#コードで実行しようとしているコマンドであり、すべて問題ありません(同じクエリがヒキガエルでスムーズに実行されます)。ただし、データセットを埋めると、ORA-00911: 無効な文字のエラーが発生します。原因がわかりません、助けてください。

 OracleCommand cmd = new OracleCommand(
            "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
            +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
            +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V   DSAT,APPS.MTL_ITEM_CATEGORIES   MIC,"
            +"APPS.MTL_CATEGORIES      MC"
        + " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE(@vfrom,'dd/mm/yyyy') AND TO_DATE(@vto,'dd/mm/yyyy')"+
            " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
            +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
            +" AND DSAT.FORECAST_SET IN (@vForecastSetDPL1,@vForecastSetDPL2,@vForecastSetURIL)"
            +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN';", con);
        cmd.Parameters.Add("@vfrom",OracleDbType.Varchar2).Value= vfrom;
        cmd.Parameters.Add("@vto",OracleDbType.Varchar2).Value= vto;
        cmd.Parameters.Add("@vForecastSetDPL1", OracleDbType.Varchar2).Value=vForecastSetDPL1;
        cmd.Parameters.Add("@vForecastSetDPL2",OracleDbType.Varchar2).Value=vForecastSetDPL2;
        cmd.Parameters.Add("@vForecastSetURIL",OracleDbType.Varchar2).Value= vForecastSetURIL;

        cmd.CommandType = CommandType.Text;

使用されるすべての変数は文字列型であるため、日付には TO_DATE を使用する必要があります。残りのパラメーターは文字列型であると想定されています。

4

2 に答える 2

1

パラメータを送信する代わりに、最初にクエリを作成してから実行できます。あなたのコードでは、セミコロンは必要ありません'MICRO WAVE OVEN';"

    string _currentQuery = "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
    +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
    +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V DSAT,APPS.MTL_ITEM_CATEGORIES MIC,"
    +"APPS.MTL_CATEGORIES MC"
+ " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE('" + vfrom + "','dd/mm/yyyy') AND TO_DATE('" + vto + "','dd/mm/yyyy')" +
    " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
    +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
    +" AND DSAT.FORECAST_SET IN ('" + vForecastSetDPL1 + "','" + vForecastSetDPL2 + "','" + vForecastSetURIL + "')"
    +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN'";

    OracleCommand cmd = new OracleCommand(_currentQuery,con);

    cmd.CommandType = CommandType.Text;

編集

コードの変更。実際のデータでテストしていません

OracleCommand cmd = new OracleCommand(
            "SELECT DSAT.ORGANIZATION_ID, APPS.DAW_INV_ORG_NAME(DSAT.ORGANIZATION_ID) ORGANIZATION_NAME,APPS.DAW_CAT_NAME(MC.SEGMENT4) PRODUCT,TRUNC(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE)) TRANSACTION_DATE,"
            +"TO_CHAR(NVL(DSAT.SCH_END_DATE,DSAT.SCH_START_DATE),'MM-YYYY') MONTH,DSAT.ITEM_SEGMENTS ITEM_CODE, DSAT.ITEM_DESCRIPTION,"
            +"DSAT.CURRENT_FORECAST_QUANTITY PLAN_QTY FROM APPS.DAW_SCPDB_ASCP_TPP_V   DSAT,APPS.MTL_ITEM_CATEGORIES   MIC,"
            +"APPS.MTL_CATEGORIES      MC"
        + " WHERE NVL(SCH_END_DATE,SCH_START_DATE) BETWEEN TO_DATE(:vfrom,'dd/mm/yyyy') AND TO_DATE(:vto,'dd/mm/yyyy')"+
            " AND  MIC.CATEGORY_SET_ID=1100000061 AND  MC.CATEGORY_ID=MIC.CATEGORY_ID AND  DSAT.INVENTORY_ITEM_ID=MIC.INVENTORY_ITEM_ID"
            +" AND  DSAT.ORGANIZATION_ID=MIC.ORGANIZATION_ID"
            +" AND DSAT.FORECAST_SET IN (:vForecastSetDPL1,:vForecastSetDPL2,:vForecastSetURIL)"
            +" AND APPS.DAW_CAT_NAME(MC.SEGMENT4) ='MICRO WAVE OVEN'", con);
        cmd.Parameters.Add("vfrom",OracleDbType.Varchar2).Value= vfrom;
        cmd.Parameters.Add("vto",OracleDbType.Varchar2).Value= vto;
        cmd.Parameters.Add("vForecastSetDPL1", OracleDbType.Varchar2).Value=vForecastSetDPL1;
        cmd.Parameters.Add("vForecastSetDPL2",OracleDbType.Varchar2).Value=vForecastSetDPL2;
        cmd.Parameters.Add("vForecastSetURIL",OracleDbType.Varchar2).Value= vForecastSetURIL;

        cmd.CommandType = CommandType.Text;

これらの解決策がうまくいかない場合は、エラーを投稿してください

于 2013-08-30T15:53:34.073 に答える
1

問題は、クエリで「@」を使用することですが、Oracle では「:」を使用する必要があることです。

 BETWEEN TO_DATE(@vfrom,'dd/mm/yyyy') - incorrect 
 BETWEEN TO_DATE(:vfrom,'dd/mm/yyyy') - correct

ストアド プロシージャを使用するには、sys_refcursor を返す出力パラメータを作成する必要があり、すべて問題ありません。

于 2013-08-30T18:22:59.310 に答える