query調用存儲過程
⑴ delphi 中 使用ADOQuery 如何執行已有的存儲過程
建立proc
create proc MyABC @a int ,@b int, @c int output
as
set @c=@a*@b
在sql中執行:
declare @a int,@b int,@c int
set @a=250
set @b=40
exec MyABC @a,@b,@c output --注意要添加output 關鍵字!
select @c
在D中:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(『execute MyABC :a,:b,:c output『);//也要添加output 關鍵字!
ADOQuery1.Parameters.ParamByName(『a『).Value:=250;
ADOQuery1.Parameters.ParamByName(『b『).Value:=40;
ADOQuery1.ExecSQL;
showmessage(ADOQuery1.Parameters.ParamByName(『c『).Value);
⑵ 使用query控制項怎麼調用存儲過程
過程如下:
public Boolean doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Transaction tr = session.beginTransaction();
SQLQuery query = session.createSQLQuery("{call CommandAdapter(?,?,?,?)}");
query.setString(0,"ls");
query.setInteger(1, machineid);
query.setString(2, param);
query.setInteger(3, 0); //
query.executeUpdate();
tr.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
session.close();
}
}
使用hibernate調用帶參數返回值的存儲過程方法
在調用帶參數返回值的方法時,需使用到CallableStatement對象。因此,首先得設法獲取一個Connection。
獲取Connection 方法:
(1)session.connection();//此方法目前已被棄用
(2)SessionFactoryUtils.getDataSource(sessionFactory).getConnection()
不
過我在使用SessionFactoryUtils.getDataSource(sessionFactory)時,一直獲取的都是空值,為此參考
SessionFactoryUtils的源代碼直接利用ConnectionProvider對象來獲取一個Connection實例。
完整代碼:
SessionFactory sessionFactory=this.getSessionFactory();
if (sessionFactory instanceof SessionFactoryImplementor){
ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory).getConnectionProvider();
try {
CallableStatement statement = cp.getConnection().prepareCall(
"{call MachineDataQuery(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
statement.setInt(1, machineId);
statement.setInt(2, jobId);
statement.setInt(3, partTypeId);
statement.setInt(4, compentId);
statement.setInt(5, opId);
statement.setInt(6, roleId);
statement.setInt(7, userId);
statement.setString(8, sd);
statement.setString(9, ed);
statement.registerOutParameter(10, Types.FLOAT);
statement.registerOutParameter(11, Types.FLOAT);
statement.registerOutParameter(12, Types.FLOAT);
statement.registerOutParameter(13, Types.FLOAT);
statement.registerOutParameter(14, Types.FLOAT);
statement.execute();
System.out.println(statement.getFloat(10));
System.out.println(statement.getFloat(11));
System.out.println(statement.getFloat(12));
System.out.println(statement.getFloat(13));
System.out.println(statement.getFloat(14));
} catch (SQLException e) {
e.printStackTrace();
}finally{
cp.close();
}
}
ps:切記存儲過程中不可有多餘的print或select語句,否則會拋出異常「com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用於更新的結果集。」
⑶ hibernate調用存儲過程
hibernate3.0以上提供了兩種方式執行存儲過程。
第一種 :用JDBC 方式
Session session =HibernateSessionFactory.getSession(); //獲取hibernate會話
Connection conn = session.connection(); // 用session對象獲取連接
ResultSet rs =null;
try
{
CallableStatement call = conn.prepareCall("{Call pro_getManager(?,?)}");
call.setString(1, "admin");
call.setString(2, "admin");
rs = call.executeQuery();
}
catch (Exception e)
{
e.printStackTrace();
}finally
{
rs.close();//關閉
session.close();//關閉連接
HibernateSessionFactory.closeSession(); //關閉會話
}
這種方式本人感覺與hibernate結合不很緊密,還難以控制,還要自己控制關閉
第二種: 用hibernate中SQLQuery 介面執行,其實與執行sql沒有兩樣。
Session session =HibernateSessionFactory.getSession(); //獲取hibernate會話
String procName="{Call pro_getManager(?,?) }";
SQLQuery query = session.createSQLQuery(proc);
query.setString(0, "admin");
query.setString(1, "admin");
List list =query.list();
session.close();
HibernateSessionFactory.closeSession();
⑷ 關於delphi中用TQuery控制項調用存儲過程
如果用TQuery通過SQL語句執行存儲過程應該是
SQl
:=
'
exec
存儲過程名
參數1...參數n
'
⑸ Hibernate調用存儲過程,使用SQLQuery的方式,請問如果返回參數是CURSOR,怎麼寫呢
我使用的oracle
proc.registerOutParameter(2, OracleTypes.CURSOR);
不過第一個數好像是從1開始的吧
⑹ mysql 存儲過程怎麼調用
php調用mysql存儲過程和函數的方法
存儲過程和函數是MySql5.0剛剛引入的。關於這方面的操作在PHP裡面沒有直接的支持。但是由於Mysql PHP API的設計,使得我們可以在以前的PHP版本中的mysql php api中支持存儲過程和函數的調用。
在php中調用存儲過程和函數。
1。調用存儲過程的方法。
a。如果存儲過程有 IN/INOUT參數,聲明一個變數,輸入參數給存儲過程,該變數是一對,
一個php變數(也可以不必,只是沒有php變數時,沒有辦法進行動態輸入),一個Mysql
變數。
b。如果存儲過程有OUT變數,聲明一個Mysql變數。
mysql變數的聲明比較特殊,必須讓mysql伺服器知道此變數的存在,其實也就是執行一條mysql語句。
入set @mysqlvar=$phpvar ;
c。使用mysql_query()/mysql_db_query()執行mysql 變數聲明語句。
mysql_query("set @mysqlvar=$pbpvar");
這樣,在mysql伺服器裡面就有一個變數,@mysqlar。如果是IN參數,那麼其值可以由phpar傳入。
d。 如果是存儲過程。
1。執行 call procere()語句。
也就是mysql_query("call proceer([var1]...)");
2. 如果有返回值,執行select @ar,返回執行結果。
mysql_query("select @var)"
接下來的操作就和php執行一般的mysql語句一樣了。可以通過mydql_fetch_row()等函數獲得結果。
如果時函數。 直接執行 select function() 就可以了。
$host="localhost";
$user="root";
$password="11212";
$db="samp_db";
$dblink=mysql_connect($host,$user,$password)
or die("can't connect to mysql");
mysql_select_db($db,$dblink)
or die("can't select samp_db");
$res=mysql_query("set @a=$password",$dblink);
$res=mysql_query("call aa(@a)",$dblink);
$res=mysql_query("select @a",$dblink);
$row=mysql_fetch_row($res);
echo $row[0];
⑺ Delphi怎樣使用存儲過程參數
調用存儲過程最好使用Query組件,本人就是用Tstoredproc組件而屢屢出錯!這一段痛心疾首的錯誤老是涉及到ISAPI32.dll,讓我這個丈二和尚模不到屁股。使用Query控制項調用存儲過程如下:加入你的存儲過程有兩個參數:CREATE
PROCEDURE
Procere_Name
@proc1
int,@proc2
char(8)AS……則你的Query1控制項的代碼如下:With
Query1
doBegin
Close;
SQL.Clear;
SQL.Add('
Exec
Procere_Name
:proc1,:proc2
');
ParamByName('proc1').Value:=4;
ParamByName('proc2').Value:='Hello';
Try
ExecSQL;
Except
raise;
EndEnd
