Ontbrekende IN- of UIT-parameter bij index :: 8

    String s1 = "create table testing " +
          "(id number NOT NULL PRIMARY KEY, " +
          "url varchar(1000) NOT NULL, " +
          "urlHash varchar(1000) NOT NULL, " +
          "contentHash varchar(1000), " +
          "modDate date, " +
          "contentLocation varchar(1000), " +
          "status integer, " +
          "lastCrawlDate date) ";
String s2 = "create sequence " +sequenceName+ " start with 1 increment by 1 nomaxvalue";

stmt=conn.createStatement();
stmt.executeUpdate(s1);
stmt.executeUpdate(s2);

What's wrong with this below merge statement I always get error as

Missing IN or OUT parameter at index:: 8

Ik probeer String datum tijd te converteren naar Date dataType in oracle sql bij het opstellen van de statment

ps =  conn.prepareStatement(
"MERGE INTO testing " +
"USING (  SELECT ? AS url, " +     //We will maybe add this record
"                ? AS urlHash, " +
"                ? AS contentHash, "+
"        TO_DATE(?, 'YYYY-MM-DD'T'HH24:MI:SS'Z'') AS modDate, "+
"        ? AS contentLocation, "+
"        ? AS status, "+
"      TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS lastCrawlDate "+
"           FROM dual ) maybe "+
"   ON (maybe.urlHash = testing.urlHash) "+
"       WHEN MATCHED THEN "+
// We only need update the fields that might have changed
"       UPDATE SET testing.contentHash     = maybe.contentHash, "+
"                  testing.modDate         = maybe.modDate, "+
"                  testing.contentLocation = maybe.contentLocation, "+
"                  testing.status          = maybe.status, "+
"                  testing.lastCrawlDate   = maybe.lastCrawlDate "+
// But only if the new record is more recent
"        WHERE TO_CHAR(testing.modDate, 'YYYY-MM-DD'T'HH24:MI:SS'Z'') < TO_CHAR(maybe.modDate, ''YYYY-MM-DD'T'HH24:MI:SS'Z''') "+
"       WHEN NOT MATCHED THEN "+
// Insert new URL record
"   INSERT VALUES (test_seq.nextval, maybe.url, maybe.urlHash, maybe.contentHash, maybe.modDate, maybe.contentLocation, maybe.status, maybe.lastCrawlDate)");


    ps.setString (1, "http://www.computergeeks.com");
    ps.setString (2, "ahsasoiowiewie");
    ps.setString (3, "sgasjwhwueybdbfndf");
    ps.setString (4, "2011-07-28T23:54:14Z");
    ps.setString (5, "c://");
    ps.setLong (6, 0);
    ps.setString (7, "2010-09-24 23:34:14"); 
    ps.executeUpdate();
    ps.close();
0
Ik kan nooit begrijpen waarom mensen geen voordeel halen uit de opgeslagen procedures en functies, om weg te zijn van het gebruik van deze dwaze code!
toegevoegd de auteur JonH, de bron

2 antwoord

De datumindeling in je eerste TO_DATE -aanvraag doet niet ter zake - je probeert enkele aanhalingstekens in een enkele reeks te gebruiken, zodat deze niet correct wordt ingesloten. Waarschijnlijk geeft dit de parser past, wat resulteert in een niet erg verstandige foutmelding.

In een Oracle-datumindeling moeten de letterlijke bits tussen dubbele aanhalingstekens worden geplaatst, niet afzonderlijk:

select TO_DATE('2011-07-28T23:54:14Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') from dual;

U moet het formaat 'JJJJ-MM-DD "T" HH24: MI: SS "Z"' in uw SQL-instructie opnemen. Zorg ervoor dat u de dubbele aanhalingstekens juist verwijdert, zodat ze de Java-reeks niet beëindigen.

2
toegevoegd

Dit is misschien niet van toepassing op uw probleem, maar ik kreeg dezelfde foutmelding en ik had toevallig twee commentaarregels aan het begin van mijn SQL. Ik verplaatste die naar de bodem en de fout ging weg.

1
toegevoegd