oracle存儲過程調度
在Oracle中用pl/sql代碼塊就可以調用存儲過程,如下:
begin
-- Call the procere
test(is_year_id => :is_year_id,
is_district_id => :is_district_id,
is_district_sub_id => :is_district_sub_id,
is_district_level => :is_district_level,
os_meg => :os_meg,
os_code => :os_code);
end;
參數如果都是輸入參數給常量就可以 如果有輸出型參數,你就得聲明變數,然後傳進去,如:
declare
聲明變數
begin
-- 調用過程 把輸出弄參數用變數傳進去 過程調用後解析這個變數值就行了
end;
看了上次給你改的過程,如果要調用那個過程的話可以這么寫:
declare
flag number(1);
begin
-- 調用過程 把輸出弄參數用變數傳進去 過程調用後解析這個變數值就行了
_Login(flag ) ;
--根據你的需要對flag的值不同去做不同的事情
if flag=1 then
--寫你要處理的內容
end if;
end;
『貳』 oracle 存儲過程中調用存儲過程
一個帶參數的存儲過程。
SQL> CREATE OR REPLACE PROCEDURE HelloWorld1 (
2 p_user_name VARCHAR2
3 ) AS
4 BEGIN
5 dbms_output.put_line('Hello ' || p_user_name || '!');
6 END HelloWorld1;
7 /
Procere created.
SQL> CREATE OR REPLACE PROCEDURE CallHelloWorld1 (
2 p_user VARCHAR2
3 ) AS
4 BEGIN
5 -- 調用存儲過程的 存儲過程
6 HelloWorld1(p_user);
7 END CallHelloWorld1;
8 /
Procere created.
執行
SQL> set serveroutput on
SQL> exec CallHelloWorld1( 'Tom' );
Hello Tom!
PL/SQL procere successfully completed.
『叄』 Oracle如何創建存儲過程和如何調用存儲過程
【delphi+oracle報表解決方案(一)】delphi中調用oracle的存儲過程(分帶返回遊標,不返回值兩種)
關鍵字: delphi ,oracle存儲過程,游標,返回數據集,報表註:delphi 6+ oracle 8.1.6一.創建包與包體1.附:建表aaclass為下面作測試用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS type rc_class is ref cursor;
--求p1,p2的和與差,返回的多個值通過游標返回
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);
--查詢滿足條件的數據集,返回數據集通過游標返回
procere GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一條記錄,不返回結果集時,本人用AdoQuery調用(adodataset好象要求必須返回結果集)
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1; 3.建包體CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
ASprocere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from al;
END ;
procere GetClass2(a in number,ResultCursor out rc_class )
is
begin open ResultCursor for
select aaclass.* from aaclass where pnumber >a;end ;procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ; 二.在delphi中利用AdoDataSet調用上述第一個存儲過程
1.利用AdoConnection1連接資料庫(驅動為 oracle Provider for OLE DB),
**並在連接字元串中加入這一節: PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗體上加AdoDataSet1 指明連接為上述AdoConnection1,下面可以放一個按鈕,單擊按鈕就能調用第一步中創建的包過程,並返回數據集。代碼如下所示:
procere TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
//輸出遊標的參數不需要指定!!!!!!,本來此函數帶三個參數,我們這里只需要傳兩個參數.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ; //***C 順序有關,createparam必須放在commandtext賦值語句之後. // 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,45為傳入的實參值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//創建第二個參數,根據createparameter的順序 自動與call中的第二個參數對應
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4); //下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
ADODataSet1.Open ; //根據存儲過程,數據集只有一條記錄,所以不需要用while do 來遍歷數據集,直接取數據了 //此處的欄位名根據包過程中的返回遊標 對應的欄位名來取
//定義的存儲過程返回遊標如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from al;
//把對應的欄位值取出來即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ; //顯示結果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;end;
三.在delphi中利用AdoDataSet調用上述第二個存儲過程
還是利用上述的AdoDataSet1來調用第二個存儲過程,無需任何改動,加第二個按鈕,單擊時代碼如下:procere TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
//輸出遊標的參數不需要指定!!!!!!,本來此函數帶兩個參數,我們這里只需要傳一個參數.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ; //***C 順序有關,createparam必須放在commandtext賦值語句之後. // 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,20為傳入的實參值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);
//下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
ADODataSet1.Open ; while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end; 四 利用adoquery調用第三個過程,不返回數據集的procere TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;
end;
五 利用adoquery調用第一個過程,返回數據集的.
procere TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;六.關於三層體系的此類問題兩層的解決了,三層類似.
中間層用tadodataset 或tadoquery (+tdatasetprovider),中間層的adoconnection的連接字元串加上plsqlRset=1;
客戶端用clientdataset ,大同小異,舉例如下: begin
//調用相應的過程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := '{call PackageName.ProcereName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;
end ;
本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/yzsind/archive/2005/01/20/261176.aspx
『肆』 Oracle中存儲過程相互調用問題
使用包返回存儲過程結果集,例子:
create or replace package pkg_return_table
is
type c1 is ref
cursor;
procere p_return_table(v_c1 out c1); --定義存儲過程返回一個結果集
function f_return_table return pkg_return_table.c1; --定義函數返回一個結果集
procere
p_return_table1(v_id int,v_c1 out c1,v_c2 out c1);
--定義存儲過程返回多個結果集
end;
/
create or replace package body pkg_return_table
is
procere
p_return_table(v_c1 out c1)
is
begin
open v_c1 for select * from
student;
end p_return_table;
function f_return_table return
pkg_return_table.c1
is
v_c1 pkg_return_table.c1;
begin
open v_c1 for select * from student;
return v_c1;
end
f_return_table;
procere p_return_table1(v_id int,v_c1 out c1,v_c2 out
c1)
is
sqlstr varchar2(500);
begin
sqlstr:='select * from
student';
open v_c1 for sqlstr; --使用動態sql
sqlstr:='select * from
student where id=:w_id';
open v_c2 for sqlstr using v_id; --動態sql傳參
end p_return_table1;
end pkg_return_table;
/
--存儲過程調用
variable v_c1 REFCURSOR;
exec
pkg_return_table.p_return_table(:v_c1);
print v_c1;
--存儲過程調用
variable v_c1 REFCURSOR;
variable
v_c2 REFCURSOR;
exec
pkg_return_table.p_return_table1(1,:v_c1,:v_c2);
print v_c1;
print
v_c2;
--函數調用
select pkg_return_table.f_return_table()
from al;
重點是定義游標變數,獲取存儲過程結果集,然後Open游標,就跟平常的游標一樣的操作啦
不用包應該也可以的,定義REFCURSOR變數即可
『伍』 oracle 怎麼調用存儲過程
ORACLE存儲過程 以oracle自帶例子資料庫的表舉例
1、
create or replace procere p
is
cursor c is
select * from emp2 for update;
begin
for v_emp in c loop
if(v_emp.sal <2000) then
update emp2 set sal =sal+1 where current of c ;
elsif(v_emp.sal>=2000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end;
創建了存儲過程不代表運行了存儲過程;
運行此存儲過程 :
方式一 exec p;
方式二
begin
p;
end;
2、帶參數的存儲過程
in 相當於程序里的參數,供傳入用,在存儲過程不能改變其值;
out 相當於程序里的返回值,在存儲過程中可以為其賦值傳出;
in out 既可以當參數又可以當返回值用;
不帶上述說明符默認為in類型;
下例中v_a v_b 為in類型
v_c 為out類型
v_d 為in out 類型
create or replace procere p(v_a in number,v_b number,v_c out number,v_d in out number)
is
begin
if(v_a > v_b) then
v_c := v_a;
else
v_c := v_b;
end if;
v_d := v_d+1;
end;
---> 調試時:
可以在命令窗口調試,出錯時 用show errors 顯示出錯信息;
可以在plDv中調試;
---> 運行時:
可以在命令窗口運行:
declare
v_a number:=3;
v_b number:=4;
v_c number;
v_d number:=5;
begin
p(v_a,v_b,v_c,v_d);
dbms_output.put_line(v_c);
dbms_output.put_line(v_d);
end;
可以在plDv中調試;
『陸』 oracle SQL語句中怎麼樣調用存儲過程
PL/SQL是ORACLE對標准資料庫語言的擴展,ORACLE公司已經將PL/SQL整合到ORACLE 伺服器和其他工具中了,近幾年中更多的開發人員和DBA開始使用PL/SQL,本文將講述PL/SQL基礎語法,結構和組件、以及如何設計並執行一個PL/SQL程序。
PL/SQL的優點
從版本6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的優點以及其獨有的數據管理的便利性,那麼你很難想像ORACLE缺了PL/SQL的情形。PL/SQL 不是一個獨立的產品,他是一個整合到ORACLE伺服器和ORACLE工具中的技術,可以把PL/SQL看作ORACLE伺服器內的一個引擎,sql語句執行者處理單個的sql語句,PL/SQL引擎處理PL/SQL程序塊。當PL/SQL程序塊在PL/SQL引擎處理時,ORACLE伺服器中的SQL語句執行器處理pl/sql程序塊中的SQL語句。
PL/SQL的優點如下:
. PL/SQL是一種高性能的基於事務處理的語言,能運行在任何ORACLE環境中,支持所有數據處理命令。通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素。
. PL/SQL支持所有SQL數據類型和所有SQL函數,同時支持所有ORACLE對象類型
. PL/SQL塊可以被命名和存儲在ORACLE伺服器中,同時也能被其他的PL/SQL程序或SQL命令調用,任何客戶/伺服器工具都能訪問PL/SQL程序,具有很好的可重用性。
. 可以使用ORACLE數據工具管理存儲在伺服器中的PL/SQL程序的安全性。可以授權或撤銷資料庫其他用戶訪問PL/SQL程序的能力。
. PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何ORACLE能夠運行的操作系統都是非常便利的
. 對於SQL,ORACLE必須在同一時間處理每一條SQL語句,在網路環境下這就意味作每一個獨立的調用都必須被oracle伺服器處理,這就佔用大量的伺服器時間,同時導致網路擁擠。而PL/SQL是以整個語句塊發給伺服器,這就降低了網路擁擠。
PL/SQL塊結構
PL/SQL是一種塊結構的語言,組成PL/SQL程序的單元是邏輯塊,一個PL/SQL 程序包含了一個或多個邏輯塊,每個塊都可以劃分為三個部分。與其他語言相同,變數在使用之前必須聲明,PL/SQL提供了獨立的專門用於處理異常的部分,下面描述了PL/SQL塊的不同部分:
聲明部分(Declaration section)
聲明部分包含了變數和常量的數據類型和初始值。這個部分是由關鍵字DECLARE開始,如果不需要聲明變數或常量,那麼可以忽略這一部分;需要說明的是游標的聲明也在這一部分。
執行部分(Executable section)
執行部分是PL/SQL塊中的指令部分,由關鍵字BEGIN開始,所有的可執行語句都放在這一部分,其他的PL/SQL塊也可以放在這一部分。
異常處理部分(Exception section)
這一部分是可選的,在這一部分中處理異常或錯誤,對異常處理的詳細討論我們在後面進行。
PL/SQL塊語法
[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END
PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以使多行的,但分號表示該語句的結束。一行中可以有多條SQL語句,他們之間以分號分隔。每一個PL/SQL塊由BEGIN或DECLARE開始,以END結束。注釋由--標示。
PL/SQL塊的命名和匿名
PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊。匿名程序塊可以用在伺服器端也可以用在客戶端。
命名程序塊可以出現在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,子程序可以在執行部分引用,也可以在異常處理部分引用。
PL/SQL程序塊可背獨立編譯並存儲在資料庫中,任何與資料庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序:
. 函數
. 過程
. 包
. 觸發器
函數
函數是命名了的、存儲在資料庫中的PL/SQL程序塊。函數接受零個或多個輸入參數,有一個返回值,返回值的數據類型在創建函數時定義。定義函數的語法如下:
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]
過程
存儲過程是一個PL/SQL程序塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,定義存儲過程的語法如下:
PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]
包(package)
包其實就是被組合在一起的相關對象的集合,當包中任何函數或存儲過程被調用,包就被載入入內存中,包中的任何函數或存儲過程的子程序訪問速度將大大加快。
包由兩個部分組成:規范和包主體(body),規范描述變數、常量、游標、和子程序,包體完全定義子程序和游標。
觸發器(trigger)
觸發器與一個表或資料庫事件聯系在一起的,當一個觸發器事件發生時,定義在表上的觸發器被觸發。
變數和常量
變數存放在內存中以獲得值,能被PL/SQL塊引用。你可以把變數想像成一個可儲藏東西的容器,容器內的東西是可以改變的。
聲明變數
變數一般都在PL/SQL塊的聲明部分聲明,PL/SQL是一種強壯的類型語言,這就是說在引用變數前必須首先聲明,要在執行或異常處理部分使用變數,那麼變數必須首先在聲明部分進行聲明。
聲明變數的語法如下:
Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]
注意:可以在聲明變數的同時給變數強制性的加上NOT NULL約束條件,此時變數在初始化時必須賦值。
給變數賦值
給變數賦值有兩種方式:
. 直接給變數賦值
X:=200;
Y=Y+(X*20);
. 通過SQL SELECT INTO 或FETCH INTO給變數賦值
SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;
常量
常量與變數相似,但常量的值在程序內部不能改變,常量的值在定義時賦予,,他的聲明方式與變數相似,但必須包括關鍵字CONSTANT。常量和變數都可被定義為SQL和用戶定義的數據類型。
ZERO_VALUE CONSTANT NUMBER:=0;
這個語句定了一個名叫ZERO_VALUE、數據類型是NUMBER、值為0的常量。
標量(scalar)數據類型
標量(scalar)數據類型沒有內部組件,他們大致可分為以下四類:
. number
. character
. date/time
. boolean