/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_sdbc_XPreparedStatement_idl__ 
#define __com_sun_star_sdbc_XPreparedStatement_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_sdbc_SQLException_idl__ 
#include <com/sun/star/sdbc/SQLException.idl> 
#endif 
 
 module com {  module sun {  module star {  module sdbc { 
 
 published interface XConnection; 
 published interface XResultSet; 
 
 
/** provides the possibility of executing a precompiled SQL statement.
	
	
	<p>
	A SQL statement is pre-compiled and stored in a PreparedStatement object.
	This object can then be used to efficiently execute this statement multiple
	times.
	</p>
 */
published interface XPreparedStatement: com::sun::star::uno::XInterface
{ 
     
	/** executes the SQL query in this 
		<code>PreparedStatement</code>
		object and returns the result set generated by the query.
		@returns
			the ResultSet object
		@throws SQLException 
			if a database access error occurs.
	 */
	XResultSet executeQuery() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** executes the SQL INSERT, UPDATE or DELETE statement in this
		<type scope="com::sun::star::sdbc">PreparedStatement</type>
		object.
		<br/>
		In addition, SQL statements that return nothing, such as
		SQL DDL statements, can be executed.
		@returns
			either the row count for INSERT, UPDATE or DELETE statements; or 0 for SQL statements that return nothing
		@throws SQLException 
			if a database access error occurs.
	 */
	long executeUpdate() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** executes any kind of SQL statement.
		
		
		<p>
		Some prepared statements return multiple results; the execute
		method handles these complex statements as well as the simpler
		form of statements handled by executeQuery and executeUpdate.
		</p>
		@returns
			<TRUE/> if successful
		@throws SQLException 
			if a database access error occurs.
	 */
	boolean execute() raises (SQLException); 
	//------------------------------------------------------------------------- 
     
	/** returns the 
		<type scope="com::sun::star::sdbc">Connection</type>
		object
		that produced this 
		<type scope="com::sun::star::sdbc">Statement</type>
		object.
		@returns
			the Connection object
		@throws SQLException 
			if a database access error occurs.
	 */
	XConnection getConnection() raises (SQLException); 
}; 
 
//============================================================================= 
 
}; }; }; }; 
 
/*=========================================================================== 
===========================================================================*/ 
#endif 
