sql >> Databáze >  >> RDS >> Oracle

Neplatný měsíc při provádění procedury parametru IN s hodnotou data

Váš postup přebírá parametry typu timestamp . Ve skutečnosti předáváte parametry typu varchar2 ve vašem hovoru. To přinutí Oracle provést implicitní konverzi varchar2 parametry na timestamp pomocí NLS_TIMESTAMP_FORMAT vaší relace . To se pravděpodobně bude u různých relací lišit, takže je pravděpodobné, že alespoň u některých relací dojde k chybě, protože řetězec neodpovídá formátu NLS_TIMESTAMP_FORMAT dané relace. . Mnohem lépe by vám posloužilo předání skutečného časového razítka buď explicitním voláním to_timestamp nebo předáním literálu časového razítka.

Váš postup pak vezme timestamp parametry a předat je to_date funkce. to_date funkce nepřebírá parametry typu timestamp , přebírá pouze parametry typu varchar2 . To donutí Oracle provést další implicitní konverzi timestamp parametry na varchar2 , opět pomocí relace NLS_TIMESTAMP_FORMAT . Pokud je relace NLS_TIMESTAMP_FORMAT neodpovídá explicitní masce formátu ve vašem to_date zavoláte, dostanete chybu nebo konverze vrátí výsledek, který neočekáváte.

Pokud je sloupec ve vaší tabulce ve skutečnosti typu date , můžete přímo porovnat date na timestamp . Zdá se tedy, že není důvod volat to_date tady. Na základě vašich ukázkových dat se však zdá, že sloupec ve vaší tabulce je ve skutečnosti typu timestamp spíše než date jak naznačuje váš kód, od date nemá přesnost na zlomky sekund. Pokud je tomu tak, má ještě menší smysl volat to_date ve vašem SELECT protože vaše parametry jsou ve skutečnosti typu timestamp a váš sloupec je typu timestamp . Stačí porovnat timestamp hodnoty.

Můj odhad proto je, že chcete něco jako

CREATE OR REPLACE PROCEDURE PROC1(
   V_STARTTIME    IN TIMESTAMP ,
   V_ENDTIME      IN TIMESTAMP )
BEGIN
  INSERT INTO TAB1( <<column name>> )
    SELECT COINS 
      FROM TAB2
     WHERE <<timestamp column name>> BETWEEN v_starttime AND v_endtime;
END;

a že chcete volat proceduru předáním skutečných časových razítek. Použití literálů časového razítka

Execute proc1(timestamp '2014-05-05 11:25:00', timestamp '2014-05-05 12:25:00' )

nebo explicitním voláním to_timestamp

execute proc1( to_timestamp( '5/05/2014 11:25:00 AM', 'MM/DD/YYYY HH:MI:SS AM' ),
               to_timestamp( '5/05/2014 12:25:00 PM', 'MM/DD/YYYY HH:MI:SS AM' ) );

To by se mělo zbavit všech implicitních typových konverzí, které aktuálně probíhají.




  1. Otevírání nebo propojení textu nebo Excelu jako zdrojů dat v aplikaci Microsoft Access

  2. Proč to nepřijímá e-mailové adresy s pomlčkou za znakem @?

  3. Rozdíl v požadovaném čase pro vložení záznamů InnoDB/MyISAM

  4. Zaregistrujte se a spusťte PostgreSQL 9.0 jako službu Windows