Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-8174

Groovy.Sql+Oracle parameter substitution problem

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.4.11
    • 2.4.12
    • SQL processing
    • None
    • Java 1.8.0_131, Groovy 2.4.11, Oracle ojdbc7 12.1.0.2.0

    Description

      I'm using the groovy.sql libraries inside of a Java program and having trouble with parameter substitution. My code looks like this:

                      def mdds = Sql.newInstance(...)
      
      		Map<String, Object>params = new HashMap<String, Object>();
      		params.clear();
      		params.put("source_system_id", Integer.valueOf(6));
      		params.put("rec_loc_txt", "Test" + randomNum.toString());
      		params.put("created_dt_tm", new Timestamp(System.currentTimeMillis()));
      		
      		String mdSqlString = "INSERT INTO MD_CATALOG " +
      		                  "      (SOURCE_SYSTEM_ID, REC_LOC_TXT, CREATED_DT_TM)" + 
      		                  "      VALUES" + 
      		                  "      (:source_system_id, :rec_loc_txt, :created_dt_tm)";
      
      		try {
      			List<List<Object>> keys = mdds.executeInsert(params, mdSqlString);
      		} catch (SQLException e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		}
      

      But, when it runs, I get an exception thrown that says:

      Exception in thread "main" java.lang.IllegalArgumentException: Found 4 parameter placeholders but supplied with 3 parameters
      	at groovy.sql.Sql.setParameters(Sql.java:4116)
      	at groovy.sql.Sql.getPreparedStatement(Sql.java:4394)
      	at groovy.sql.Sql.executeInsert(Sql.java:2610)
      	at groovy.sql.Sql.executeInsert(Sql.java:2674)
      	at org.mitre.mac.Main.main(Main.java:70)
      

      But, I only see 3 placeholders for my 3 parameters.

      Via email, John Wagenleitner replied:

      I did a quick test with Groovy 2.4.11 and Oracle 11.2.0.4 (ojdbc6.jar 11.2.0.4 and ojdbc7.jar 12.1.0.2.0) and get the same error. From what I am seeing Oracle changes the sql to:

      INSERT INTO MD_CATALOG (SOURCE_SYSTEM_ID, REC_LOC_TXT, CREATED_DT_TM) VALUES (?, ?, ?) RETURNING ROWID INTO ?

      adding the extra bind parameter for ROWID and this is reflected in the call to metaData.getParameterCount()

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            paulk Paul King
            pixelpshr Thom DeCarlo
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment