2016-06-01 2 views
0

Я получаю сообщение об ошибке ORA-00900: недопустимое заявление SQL ORA-06512: в строке 125 00900. 00000 - "недопустимый оператор SQL" , когда я выполнить этот SQL:EXECUTE немедленным COMMAND

set serveroutput on; 
DECLARE smartsoftVersionItem varchar2(20); 
     maxScriptLevel   number; 
     sessionNo    number; 
     SQLCommand    varchar2(8000); 

BEGIN 

    SELECT MAX(software_version) 
    INTO smartsoftVersionItem 
    FROM s1_grainsmart_dbupdate; 

    SELECT MAX(script) 
    INTO maxScriptLevel 
    FROM s1_grainsmart_dbupdate; 

    SELECT MAX(session_no) 
    INTO sessionNo 
    FROM ssc_dbupdate; 

    INSERT INTO ssc_dbupdate 
     VALUES (seq_ssc_dbupdate.NEXTVAL, sessionNo, sysdate, smartsoftVersionItem, maxScriptLevel, Null, '17.00.01', 'ssc_ivc_transaction_detail_v', 'V'); 

    SQLCommand := 
     'CREATE VIEW ssc_ivc_transaction_detail_v 
     AS 
     SELECT ivc_transaction_detail.ivc_transaction_nbr, 
       ivc_transaction_detail.plc_id, 
       ivc_transaction_detail.commodity_id, 
       ivc_transaction_detail.opening_date, 
       ivc_transaction_detail.group_nbr, 
       ivc_transaction_detail.sort_order, 
       ivc_transaction_detail.transaction_source, 
       ivc_transaction_detail.transaction_time, 
       ivc_transaction_detail.quantity_lb, 
       ROUND(ivc_transaction_detail.quantity_lb * quantity_uom.conv_factor/10000, quantity_uom.to_nbr_of_decimals) 
               AS quantity, 
       ivc_transaction_detail.dollar_value, 
       ivc_transaction_detail.add_by, 
       ivc_transaction_detail.orderlog_plc_id, 
       ivc_transaction_detail.orderlog_nbr, 
       ivc_transaction_detail.quantity_entry_nbr, 
       ivc_transaction_detail.contract_nbr, 
       ivc_transaction_detail.vendor_customer_id, 
       ivc_transaction_detail.transaction_note, 
       ivc_transaction_detail.ivc_lot_nbr, 
       ivc_transaction_detail.vehicle_disposition_nbr, 
       ivc_transaction_detail.receipt_nbr, 
       ivc_transaction_detail.adj_type_nbr, 
       ivc_transaction_detail.inv_adj_nbr, 
       ivc_transaction_detail.adj_quantity, 
       ivc_transaction_detail.production_nbr, 
       ivc_transaction_detail.bin_transaction_nbr, 
       ivc_transaction_detail.prd_to_prd_processing_nbr, 
       ivc_transaction_detail.oe_plc_id, 
       ivc_transaction_detail.oe_order_nbr, 
       ivc_transaction_detail.oe_line_item_nbr, 
       ivc_transaction_detail.po_plc_id, 
       ivc_transaction_detail.po_order_nbr, 
       ivc_transaction_detail.po_line_item_nbr, 
       ivc_transaction_detail.mps_contract_nbr, 
       ivc_transaction_detail.production_oh_dollar_value, 
       ivc_transaction_detail.transfer_in_product_cost, 
       ivc_transaction_detail.ae_plc_id, 
       ivc_transaction_detail.ae_accrual_nbr, 
       ivc_transaction_detail.transfer_plc_id, 
       ivc_transaction_detail.transfer_order_nbr, 
       ivc_transaction_detail.transfer_sort_order, 
       ivc_transaction_detail.exchange_rate, 
       ivc_transaction_detail.from_currency_code, 
     '; 

     IF maxScriptLevel >= 1700000117 THEN  -- WO-1702 
       SQLCommand := SQLCommand || 
       'ivc_transaction_detail.theoretical_variance_value, 
       ivc_transaction_detail.dollar_value_basis, 
       ivc_transaction_detail.dollar_value_futures, 
       ivc_transaction_detail.dollar_value_discount, 
       ivc_transaction_detail.dollar_value_other, 
       ivc_transaction_detail.adj_futures_by, 
       ivc_transaction_detail.iv_option_month, 
       ivc_transaction_detail.after_adj_iv_option_month, 
       ivc_transaction_detail.iv_roll_option_month_nbr, 
       ivc_transaction_detail.market_futures_subs_flag, 
       ivc_transaction_detail.zero_futures_subs_flag, 
       ivc_transaction_detail.market_basis_subs_flag, 
       ivc_transaction_detail.zero_basis_subs_flag, 
       '; 
     END IF; 

     IF maxScriptLevel > 1700030087 THEN  -- WO-1840 
       SQLCommand := SQLCommand || 
       'ivc_transaction_detail.dollar_value_custom1, 
       ivc_transaction_detail.dollar_value_custom2, 
       '; 
     END IF; 

     IF maxScriptLevel > 1800000091 THEN  -- WO-2404 
       SQLCommand := SQLCommand || 
       'ivc_transaction_detail.transfer_receiving_nbr, 
       '; 
     END IF; 

     IF maxScriptLevel > 1800020121 THEN   -- WO-3066 
       SQLCommand := SQLCommand || 
       'ROUND(ivc_transaction_detail.cost_summary_quantity_lb * quantity_uom.conv_factor/10000, quantity_uom.to_nbr_of_decimals) 
               AS cost_summary_quantity, 
       ivc_transaction_detail.cost_summary_dollar_value 
       '; 
     END IF; 

     SQLCommand := SQLCommand || 
      ' FROM ivc_transaction_detail 
       LEFT OUTER JOIN 
        (SELECT ssc_plc_commodity_uom_v.plc_id, 
          ssc_plc_commodity_uom_v.commodity_id, 
          ssc_plc_commodity_uom_v.conv_factor, 
          ssc_plc_commodity_uom_v.to_nbr_of_decimals 
         FROM ssc_plc_commodity_uom_v 
        )       quantity_uom 
       ON quantity_uom.plc_id = ivc_transaction_detail.plc_id 
       AND quantity_uom.commodity_id = ivc_transaction_detail.commodity_id 
      '; 

    DBMS_OUTPUT.PUT_LINE ('SQL Command = ' || SQLCommand); 
    EXECUTE IMMEDIATE 'SQLCommand'; 

END; 

SQL должен быть динамическим; i.e .: Если я достиг предопределенного уровня скрипта, я хочу включить дополнительные столбцы в противном случае.

Однако, если я беру выходной SQL из моей переменной SQLCommand и запускаю его, создается представление. Мне не хватает чего-то очевидного - я просто не вижу его сейчас.

Любая помощь будет оценена по достоинству. Мюррей

+1

Удалите кавычки 'SQLCommand':' EXECUTE IMMEDIATE SQLCommand; '. В противном случае вы пытаетесь буквально выполнить строку SQL 'SQLCommand' :) – sstan

+0

Предсказание вашей следующей ошибки. Если 'maxScriptLevel <= 1800020121', ваш сгенерированный скрипт содержит запятую-запятую перед предложением' from', поэтому он не будет работать, – APC

+0

Да, вы правы. – user37793

ответ

3

Изменить

EXECUTE IMMEDIATE 'SQLCommand'; 

в

EXECUTE IMMEDIATE SQLCommand; -- no single quotes 
+0

Спасибо - это был «недостающий кусок» !!! – user37793

Смежные вопросы