c存储过程实例
Ⅰ C语言 怎么 调存储过程
C语言里没有存储过程,只有函数,函数调用有两种方式
传值调用(call by value)和传址调用(call by reference)
例如
f1(x)
{
int a;
a=3*1-1;
f2(x,a);
return a+x;
}
f2(int r,int s)
{
int y;
y=2*r+1;
s=x*r;
r=s-y;
return;
}
f1中调用了f2函数,若第一个参数采用传值方式(无返回值,即f1中x=3 不变,只是把值传给f2使用而已)第二个参数采用传址方式(返回的是s的地址引用,即f1中a的值与f2中s的值相等)若x=3,则a+x=24
Ⅱ 有一存储过程,里面实现了增删改查,我如何在C/S界面中,事件中调用此存储过程,举例说明,求高手解答!
不知道你前台语言,给你个pb中调用的例子,其他的你参考语言的帮助说明
DECLARE MySP PROCEDURE FOR bb//这个是存储过程名
@ld_date1=:ld_date1,//输入参数
@ld_date2=:ld_date2,//输入参数
@li_shitime=:li_shitime OUTPUT;//输出参数
EXECUTE MySP; //调用名字,随便定义一个
Fetch Mysp Into :li_shitime;
close mysp;
Ⅲ 写一个存储过程。
我觉得你的业务口径没有描述清楚,但是我连猜带蒙的写了一下,你看看符合你的需求否
CREATE OR REPLACE PROCEDURE p_ccrm
(v_depid ccrm_deptment.depid%type)
AS
v_shouliliang number(100);
v_wangchengliang number(100);
v_chaoshiliang number(100);
BEGIN
IF(V_DEPID=0)
THEN
select count(distinct id) shouliliang
,sum(case when workstate='已处理' or workstate='办结' then 1 else 0 end) wanchengliang
,sum(case when workendtime-workstart > XX then 1 else 0 end) chaoshiliang
into v_shouliliang,v_wanchengliang,v_chaoshiliang
from ccrm_service cs,ccrm_userlist cu,ccrm_deptment cd
where cd.depid=cs.depid
and cd.depid=cu.depid
group by deptid;
else
select count(distinct id) shouliliang
,sum(case when workstate='已处理' or workstate='办结' then 1 else 0 end) wanchengliang
,sum(case when workendtime-workstart > XX then 1 else 0 end) chaoshiliang
into v_shouliliang,v_wanchengliang,v_chaoshiliang
from ccrm_service cs,ccrm_userlist cu,ccrm_deptment cd
where cd.depid=cs.depid
and cd.depid=cu.depid
and cd.depid=v_depid
group by id;
end if;
DBMS_OUTPUT.PUT_LINE("受理量:"||v_shouliliang||“;完成量:
”||v_wanchengliang||";超时量:"||v_chaoshiliang);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Not FOUND RECORD');
END;
Ⅳ 如何通过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#编写的存储过程 要源码
使用 C# 编写扩展存储过程
下面就以一个简单的例子来演示如何用 C# 编写扩展存储过程。首先,我们创建一个简单的C#类库文件:
//C# file: Csserver.cs
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("CSServer")]
[assembly: AssemblyDescription("Test sql .NET interop")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop {
public interface ITest{
string SayHello();
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CsharpHelper : ITest {
public string SayHello() {
return "Hello from CSharp";
} } }
然后创建用sn -k 为该类库创建一个强名密钥文件,并编译之。sn -k MyKey.snk
csc /t:library Csserver.cs
注册该类库:
regasm /tlb:Csserver.tlb csserver.dll /codebase
这样一个扩展存储过程就编写注册完了,下面我们在sql server中测试一下效果。
T-SQL stored proc.
DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255), @desc varchar(255)
-- 创建对象实例。
EXEC @hr = sp_OACreate 'SQLInterop.CsharpHelper', @object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
-- 调用对象方法。
EXEC @hr = sp_OAMethod @object, 'SayHello', @return OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
PRINT @return
-- 销毁对象实例。
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END 注明:扩展存储过程扩展存储过程使您得以使用象 C 这样的编程语言创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展 Microsoft® SQL Server™ 2000 的功能。
扩展存储过程是 SQL Server 可以动态装载并执行的动态链接库 (DLL)。扩展存储过程直接在 SQL Server 的地址空间运行,并使用 SQL Server 开放式数据服务 (ODS) API 编程。
编写好扩展存储过程后,固定服务器角色 sysadmin 的成员即可在 SQL Server 中注册该扩展存储过程,然后授予其他用户执行该过程的权限。扩展存储过程只能添加到 master 数据库中。
Ⅵ c程序该怎么样调用oracle存储过程并获取存
如果已经存在一个存储过程A(参数);
那么在存储过程B中可以直接通过:
values := A(参数);即可实现调用。
备注:values必须在初始化过程中进行定义如: values VARCHAR(30);并且此类型必须与A存储过程返回参数类型一致。
Ⅶ 存储过程的实例
数据库存储过程
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下:
CREATE PROC[EDURE] procere_name [;number]
[
{@parameter data_type} ][VARYING] [= default] [OUTPUT]
]
[,...n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
sql_statement [...n]
[ ]内的内容是可选项,而()内的内容是必选项,
例:若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:
Create Proc select_del As
Delete tmp
例:用户想查询tmp表中某年的数据的存储过程
create proc select_query @year int as
select * from tmp where year=@year
在这里@year是存储过程的参数
例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。
空:表示该结点为顶层结点
fjdid(父结点编号)
结点n 非空:表示该结点的父亲结点号
dwmc(单位名称) CREATEprocsearch_dwmc@dwidoldint,@dwmcresultvarchar(100)outputasdeclare@stopintdeclare@resultvarchar(80)declare@dwmcvarchar(80)declare@dwidintsetnocountonset@stop=1set@dwmc=""select@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldset@result=rtrim(@dwmc)if@dwid=0set@stop=0while(@stop=1)and(@dwid<>0)beginset@dwidold=@dwidselect@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldif@@rowcount=0set@dwmc=""elseset@result=@dwmc+@resultif(@dwid=0)or(@@rowcount=0)set@stop=0elsecontinueendset@dwmcresult=rtrim(@result)使用execpro-name[pram1pram2.....]SQL Server中存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出订单编号为1的订单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
Oracle中的存储过程
1.创建过程
与其它的数据库系统一样,Oracle的存储过程是用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序。
语法:
create [or replace] procere procere_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<类型.变量的说明>
(注:不用 declare语句 )
Begin
<执行部分>
exception
<可选的异常处理说明>
end;
1.1 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
1.2 在存储过程内的参数只能指定参数类型;不能指定长度;
1.3 在AS或IS 后声明要用到的变量名称和变量类型及长度;
1.4 在AS或IS 后声明变量不要加declare 语句。
2.使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle 使用CALL 语句来实现对存储过程的调用。
语法:
call procere_name( parameter1, parameter2…);
3.开发过程
如今的几大数据库厂商提供的编写存储过程的工具都没有统一,虽然它们的编写风格有些相似,但由于没有标准,所以各家的开发调试过程也不一样。下面编写PL/SQL存储过程、函数、包及触发器的步骤如下:
3.1 编辑存储过程源码使用文字编辑处理软件编辑存储过程源码,要用类似WORD文字处理软件进行编辑时,要将源码存为文本格式。
3.2 对存储过程程序进行解释在SQLPLUS或用调试工具将 存储过程程序进行解释;
在SQL>下调试,可用start 或get 等Oracle命令来启动解释。如:
SQL>start c:stat1.sql
如果使用调试工具,可直接编辑和点击相应的按钮即可生成存储过程。
3.3 调试源码直到正确我们不能保证所写的存储过程达到一次就正确。所以这里的调试是每个程序员必须进行的工作之一。在SQLPLUS下来调试主要用的方法是:
1.使用 SHOW ERROR命令来提示源码的错误位置;
2.使用 USER_ERRORS数据字典来查看各存储过程的错误位置。
3.4 授权执行权给相关的用户或角色如果调试正确的存储过程没有进行授权,那就只有建立者本人才可以运行。所以作为应用系统的一部分的存储过程也必须进行授权才能达到要求。 在SQLPLUS下可以用GRANT命令来进行存储过程的运行授权。
语法:
GRANT system_privilege | role TO user | role | PUBLIC
[WITH ADMIN OPTION]
或
GRANT object_privilege | ALL column ON schema.object
TO user | role | PUBLIC WITH GRANT OPTION
其中
system_privilege: 系统权限
role: 角色名
user: 被授权的用户名
object_privilege: 所授予的权限名字,可以是
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
Column: 列名
schema: 模式名
object: 对象名
4.数据字典
USER_SOURCE 用户的存储过程、函数的源代码字典
DBA_SOURCE 整个系统所有用户的存储过程、函数的源代码字典
ALL_SOURCE 当前用户能使用的存储过程(包括其她用户授权)、函数的源代码字典
USER_ERRORS 用户的存储过程、函数的源代码存在错误的信息字典
临时表
(针对SQL2000/2005)
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。
除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。
Ⅷ 存储过程中怎么使用goto语句,举个例子的相关推荐
goto语句在C语言中不主张使用,可以用循环中加判断调用函数方式实现.
goto简单的使用:
main()
{
int a,b,c=0;
loop:
scanf("%d %d",&a,&b);
if(a>b)
goto loop1;
else
goto loop;
loop1:
c=b;
b=a;
a=b;
printf("a=%d b=%d\n",a,b);
Ⅸ 给我个真正项目中的存储过程例子
存储过程调用深度为16层,存储过程的复杂度与设计时存储过程的整体框架相关,一般底层的存储过程简单一些,实现基本的功能,而上层的存储过程调用底层的过程,从而实现复杂的功能,供程序调用。
总而言之,存储过程像模块化编程一样,都是由小模块堆积起来的。因而楼主关注存储过程的复杂度,不如有空自己多写几个小存储过程;以前我们公司的存储过程长的大概在1000行左右,短的只有几行。