c存储过程返回值
‘壹’ C++求执行存储过程,并带返回值的类库
存储过程:
Create procere proc_login
username varchar(20),
password varchar(20)
as
declare @result int
select @result=count(*) from table1 where user=@username and pass=@password
if @result=0
return 0
return 1
go
delphi代码:
var ret:integer;
......
with ADOStoredProc1 do
begin
Close;
ProcereName:='proc_login';
Parameters.Clear;
Parameters.Refresh;
Parameters.ParamByName('@username').Value:= Edit1.text;
Parameters.ParamByName('@password').Value:= Edit2.text;
ExecProc;
ret:= Parameters.ParamByName('@return_value').Value;
end;
if ret=1 //用户名密码匹配
begin
//你想要的操作
end
‘贰’ 如何 mysql 存储过程返回值
mysql中要获得存储过程的返回值,可以增加一个out参数,用来返回。
mysql中存储过程的例子:
CREATE PROCEDURE addvoucher (
IN userid INT,
IN voucherid INT,
OUT result INT
)
BEGIN
SELECT
@endate_a := endate ,@batch_a := batch ,@c_count_a := c_count,
@isdead_a := isdead
FROM
t_voucher
WHERE
id = voucherid;
SET autocommit = 0;
IF EXISTS (
SELECT
*
FROM
t_user_voucher tuv,
t_voucher tv
WHERE
tv.id = tuv.voucherid
AND tv.batch =@batch_a
) THEN
SET result = 1;-- 已存在
SELECT
result;
ELSE
IF @c_count_a > 0 THEN
IF (
TO_DAYS(@endate_a) - TO_DAYS(NOW())
) > 0 THEN
IF @isdead_a = 1 THEN
INSERT INTO t_user_voucher (userid, voucherid, isdead)
VALUES
(userid, voucherid, 1);
UPDATE t_voucher SET c_count = c_count-1 where id = voucherid;
SET result = 0;-- 成功
END;
‘叁’ 存储过程中调用带返回值的函数
如果是ACCESS、MySQL、SQL 2000 数据库
SELECT * FROM tabel_ WHERE date < (now()-30)
数据库都自带很多函数的
‘肆’ SQL 取存储过程的返回值
存储过程应该有返回值的,
问题应该出现在你vb6的调用语句中(第二个参数是输出类型的参数,
是否有正确设置).
你可以在查询分析器中执行此存储过程,
看看返回的结果.
还有,
此存储过程中的select语句最好加上top
1限制,
因为你只要判断是否能选到结果而已:
select
top
1
*
from
tb_package
where
packagenumber=@a
‘伍’ 1,存储过程和函数的区别
存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。
区别是写法和调用上。
写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;
函数的参数列表只有输入参数,并且有return <返回值类型,无长度说明>。
返回值上:
存储过程的返回值,可以有多个值,
函数的返回值,只有一个值。
调用方式上:
存储过程的调用方式有:
1)、exec <过程名>;
2)、execute <过程名>;
3)、在PL/SQL语句块中直接调用。
函数的调用方式有:
在PL/SQL语句块中直接调用。
具体分为:
----调用FUNCTION add_three_numbers
----1. 位置表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(2,4,5));
END;
----2. 命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));
END;
----3. 混合使用位置表示法和命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));
END;
----4. 排除表示法
BEGIN
dbms_output.put_line(add_three_numbers(12,c=>2));
END;
----5. sql调用表示法 --混合表示法
SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;
----1. 该函数接受3个可选参数,返回3个数字的和
CREATE OR REPLACE FUNCTION add_three_numbers
(
a NUMBER:=0, b NUMBER:=0, c NUMBER:=0
)
RETURN NUMBER IS
BEGIN
RETURN a+b+c;
END;
存储过程:
基本语法:
create procere <过程名>(<参数列表,无参时忽略>)
as|is
变量声明、初始化
begin
业务处理、逻辑代码
exception
异常捕获、容错处理
end <过程名>;
参数:<参数名> in|out|in out <参数类型,无长度说明> ,如:v_name varchar2
in:入参
out:出参
in out:出入参
注:as|is表示as或is
调用语法:
1)、exec <过程名>;
2)、execute <过程名>;
3)、在PL/SQL语句块中直接调用。
例:
create or replace procere up_wap(v_param1 in out varchar2,v_param2 in out varchar2)
is
v_temp varchar2(20);
begin
dbms_output.put_line('交换前参数1:'||v_param1||' 参数2:'||v_param2);
v_temp:=v_param1;
v_param1:=v_param2;
v_param2:=v_temp;
dbms_output.put_line('交换后参数1:'||v_param1||' 参数2:'||v_param2);
exception
when others then dbms_output.put_line('There is a error when the procere up_wap executing!');
end up_wap;
/
-- 调用存储过程
declare
v_param1 varchar2(20):='param1';
v_param2 varchar2(20):='param2';
begin
up_wap(v_param1 => v_param1,v_param2 => v_param2);
end;
/
自定义函数(function)
基本语法:
create function <函数名>(<参数列表,无参时忽略>)
return <返回值类型,无长度说明>
as|is
变量声明、初始化
begin
业务处理、逻辑代码
return <返回的值>;
exception
异常捕获、容错处理
end <函数名>;
参数:in 入参
注:只有入参的类型。
在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type或%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。
例:
create function uf_select_name_by_id_test(v_id in number)
return varchar2
is
v_name t_test.t_name%type;
begin
select t_name into v_name from t_test where t_id=v_id;
return v_name;
exception
when others then dbms_output.put_line('error');
end uf_select_name_by_id_test;
/
select uf_select_name_by_id_test(1) 姓名 from al;-- select调用
declare --pl/sql语句块调用
v_name varchar2(20);
begin
v_name:=uf_select_name_by_id_test(1);
dbms_output.put_line('name = '||v_name);
end;
/
‘陆’ 如何调用存储过程,有返回值的,有参数的,存储过程中调用存储过程
create procere proc_a as declare b int; c varchar2(10); begin proc_b(b, c); dbms_output.put_line (c); end procere a; 你照我这个写吧 proc_b(b, c); proc_b是你调用的带返回参数的存储过程 b是输入变量,c是输出变量
‘柒’ vb6.0获取sqlserver存储过程的返回值
Dim Cnn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Cnn_c As New ADODB.Command
Dim cnn_p As ADODB.Parameter
Cnn.ConnectionString = ConnStr'连接字符串
With Cnn
'.Provider = "MSDASQL"
.CursorLocation = adUseClient
.Open
End With
Set Cnn_c.ActiveConnection = Cnn
With Cnn_c
.CommandType = adCmdStoredProc
.CommandText = "存储过程名"
End With
Set cnn_p = Cnn_c.CreateParameter("ReTurn", adInteger, adParamReturnValue)
Cnn_c.Parameters.Append cnn_p
‘这里添加其他参数
Set Rs = Cnn_c.Execute'执行
'Cnn_c.Parameters("ReTurn")这就是返回值
Rs.close
Cnn.Close
Set cnn_p = Nothing
Set Cnn_c = Nothing
Set Rs = Nothing
Set Cnn = Nothing
‘捌’ 怎么从sqlserver的存储过程获得返回的数据
SQL Server中存储过程的返回值不是通过return语句返回的(return语句是在用户自定义函数中使用的),而是通过存储过程的参数来返回,在定义存储过程的参数时使用关键字output来指定此参数是返回值。
而在调用存储过程时,也必须使用关键字给接收返回值的变量,这样才能在调用时获得存储过程的返回值。
示例:
create procere dbo.pr_add @a int, @b int, @c int outputas set @c = @a + @bgo
调用:
declare @v intexecute dbo.pr_add 1, 2, @v outputselect @v
‘玖’ 如何通过c或c++调用存储过程
给个例子给你看下:
...
_CommandPtr m_cmdptr;
m_cmdptr.CreateInstance(__uuidof( Command ) );
_ParameterPtr inParam2=NULL;
_ParameterPtr inParam3=NULL;
_ParameterPtr inParam4=NULL;
_ParameterPtr outParam1=NULL;
_ParameterPtr outParam2=NULL;
_ParameterPtr outParam3=NULL;
inParam2.CreateInstance(__uuidof(Parameter));
inParam3.CreateInstance(__uuidof(Parameter));
inParam4.CreateInstance(__uuidof(Parameter));
outParam1.CreateInstance(__uuidof(Parameter));
outParam2.CreateInstance(__uuidof(Parameter));
outParam3.CreateInstance(__uuidof(Parameter));
m_cmdptr->ActiveConnection=m_pConnection;
m_cmdptr->CommandType=adCmdStoredProc;
m_cmdptr->CommandText=_bstr_t("proc_XXX");//存储过程的名称
//输入参数
inParam2=m_cmdptr->CreateParameter(_bstr_t("@P1"),adVarChar,adParamInput,32,_bstr_t(P1));
m_cmdptr->Parameters->Append(inParam2);
inParam3=m_cmdptr->CreateParameter(_bstr_t("@P2"),adVarChar,adParamInput,20,_bstr_t(P2));
m_cmdptr->Parameters->Append(inParam3);
//输出参数
outParam1=m_cmdptr->CreateParameter("@P4",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam1);
outParam2=m_cmdptr->CreateParameter("@P5",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam2);
outParam3=m_cmdptr->CreateParameter(_bstr_t("@P6"),adVarChar,adParamOutput,20,_bstr_t(P6));
m_cmdptr->Parameters->Append(outParam3);
//执行
m_cmdptr->Execute(NULL,NULL,adCmdStoredProc);
//取返回值
long p1=m_cmdptr->Parameters->GetItem("@P4")->Value;
long p2=m_cmdptr->Parameters->GetItem("@P5")->Value;
VARIANT vtP6 =m_cmdptr->Parameters->GetItem("@P6")->Value;
if (vtP6.vt != VT_NULL)
strcpy(tp,(_bstr_t)vtP6);
m_cmdptr.Detach;
‘拾’ C#调用sql存储过程插入返回值
好像有点麻烦 ~~ 我是这么写的,不知道对不对
create procere insert_country
@countrycode char(3),@country char(35)
as
begin
if (exists(select * from dbo.Country where cCountryCode=@countrycode))
insert into dbo.Country([cCountryCode],[cCountry]) values(@countrycode,@country)
end
调用如下:
private void btnInsert_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=(local);Initial Catalog=HR;Integrated Security=True";
try
{
SqlCommand cmd = new SqlCommand("exec insert_country @countrycode=@a,@country=@b",con);
SqlParameter sp1 = new SqlParameter("@a",@countrycode的值);
SqlParameter sp2 = new SqlParameter("@b",@country的值);
cmd.Parameters.AddRange(sq1,sq2)
con.Open();
int result = cmd.ExecuteNonQuery();
con.Close();
if (result > 0)
{
MessageBox.Show("添加成功");
}
else
{
MessageBox.Show("添加失败");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}