/**************************************************************
 * 
 * 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 possibilty 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 
