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行左右,短的只有幾行。