1.存儲過程編譯器事先對存儲過程金星了語法檢查處理,避免了因sql語句語法不正確引起運行時出現異常的問題.
2.只在保存存儲過程時資料庫伺服器才進行編譯,以後每次執行存儲過程都不需要再進行重新編譯而一般的sql語句每執行一次就需要資料庫引擎重新編譯一次,所以使用存儲過程可以提高資料庫執行效率(補充:這點很有用,特別是感覺你的程序和資料庫相關有點慢時可以用這點,幫你程序運行的更快)
3.可以在定義存儲過程的時候直接檢查運行的結果是否正確,可視化的設計界面提高了效率.
4.避免了查詢字元串中包含單引號等特殊字元可能會出現的問題
5.一個項目中可能會多處用到相同的sql語句,使用存儲過程便於重用
6.修改靈活方便,當需要修改完成的功能時,只需要修改定義的存儲過程即可,不必單獨修改每一個引用.
② oracle存儲過程中,is和as有什麼區別
在存儲過程(procere)和函數(function)中沒有區別,在視圖(view)中只能用as不能用is,在游標(cursor)中只能用is不能用as。
③ oracle 存儲過程 as 和is 區別
第一個問題:is和as是可以互用的,用哪個都沒關系的
第二個問題:在外面
第三個問題:過程中沒有declare關鍵字,declare用在語句塊中
第四個問題:估計你看到的是做游標定義的東東,抑或者直接就一句sql。
④ 存儲過程如果參數沒有in和out代表的是什麼
oracle 存儲過程in out inout三種參數模式
oracle過程中定義了in|out|in out3中參數模式,每個參數可以選擇其一
in 是參數的默認模式,這種模式就是在程序運行的時候已經具有值,在程序體中值不會改變。
舉個例子
create or replace procere update_price(
p_proct_id in NUMBER,
p_factor in NUMBER)
AS
.....
你在引用這個過程的時候給參數傳入值
exexute update_price(2,2.5);
這是定義的2個參數就得到了值,in模式下值不能變
out模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞回調用他的過程
in out 表示高參數可以向該過程中傳遞值,也可以將某個值傳出去
簡單的說in參數就是傳入但存儲過程裡面處理的參數
out參數就是返回值的參數。
in參數就像c++語言里函數一般的參數那樣
而out函數就像c++里函數的引用類型參數一樣
不知道我比喻是否正確,請高手指點
create or replace procere gettest2(stdname in varchar2,p_cursor in out types.mytype)
as
begin
open p_cursor for select * from test where name=stdname;
end;
例如上面的存儲過程
stdname是in參數,傳進去供查詢語句使用
p_cursor是 out參數,返回查詢的結果集
--------------------------------------------------------------------------------------------------------------------
oracle 存儲過程 in out2009-08-11 16:30
創建過程語法:
create [or replace] procere procere_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<類型.變數的說明>
( 注: 不用 declare 語句 )
Begin
<執行部分>
exception
<可選的異常處理說明>
end;
l 這里的IN表示向存儲過程傳遞參數,OUT表示從存儲過程返回參數。而IN OUT 表示傳遞參數和返回參數;
l 在存儲過程內的變數類型只能指定變數類型;不能指定長度;
l 在AS或IS 後聲明要用到的變數名稱和變數類型及長度;
l 在AS或IS 後聲明變數不要加declare 語句。
例1.
CREATE OR REPLACE PROCEDURE ModeTest (
p_InParameter IN NUMBER,
p_OutParameter OUT NUMBER,
p_InOutParameter IN OUT NUMBER) IS
v_LocalVariable NUMBER;
BEGIN
v_LocalVariable := p_InParameter; -- Legal
p_InParameter := 7; -- Illegal
p_OutParameter := 7; -- Legal
v_LocalVariable := p_outParameter; -- Illegal
v_LocalVariable := p_InOutParameter; -- Legal
p_InOutParameter := 7; -- Legal
END ModeTest;
/
§16.2.2 使用過程
存儲過程建立完成後,只要通過授權,用戶就可以在SQLPLUS 、Oracle開發工具或第三方開發工具來調用運行。Oracle使用EXECUTE 語句來實現對存儲過程的調用。
EXEC[UTE] procere_name( parameter1, parameter2…);
例:
CREATE PACKAGE emp_data AS
TYPE EmpRecTyp IS RECORD (
emp_id NUMBER(4),
emp_name VARCHAR2(10),
job_title VARCHAR2(9),
dept_name VARCHAR2(14),
dept_loc VARCHAR2(13));
TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;
PROCEDURE get_staff (
dept_no IN NUMBER,
emp_cv IN OUT EmpCurTyp);
END;
/
CREATE PACKAGE BODY emp_data AS
PROCEDURE get_staff (
dept_no IN NUMBER,
emp_cv IN OUT EmpCurTyp) IS
BEGIN
OPEN emp_cv FOR
SELECT empno, ename, job, dname, loc FROM emp, dept
WHERE emp.deptno = dept_no AND emp.deptno = dept.deptno
ORDER BY empno;
END;
END;
/
COLUMN EMPNO HEADING Number
COLUMN ENAME HEADING Name
COLUMN JOB HEADING JobTitle
COLUMN DNAME HEADING Department
COLUMN LOC HEADING Location
SET AUTOPRINT ON
VARIABLE cv REFCURSOR
EXECUTE emp_data.get_staff(20, :cv)
-----------------------------------
PROMPT
oracle 用 prompt實現列印功能,多用於提示信息。輸入命令prompt tablename1;
標准輸出為tablename1
PROMPT 告訴SQL*Plus 在屏幕上書寫一行文字。你在這里使用了兩個PROMPT命令;每個命令都在屏幕上列印一個空行,這對於垂直間距很有好處。ACCEPT命令是等待用戶輸入一個置換變數的值。ACCEPT命令中可選的PROMPT 子句在用戶輸入數值的同一行中顯示了一條信息。你在PL/SQL 塊的外面放置PROMPT 和 ACCEPT 是正確的:他們是SQL*Plus 命令,不是PL/SQL 。
⑤ 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;
/
⑥ 創建存儲過程is和as有什麼區別
is 用來判斷類型 如: if(val is String){.....}
as 作為/當做 的意思吧,我敘述不清,給你個例子吧:
function xx(e:Event):void{
var ss:Loader = e.target as Loader; // 讓SS共享調用XX事件的對象的信息;
..}
⑦ 什麼是存儲過程
CREATE PROCEDURE [擁有者.]存儲過程名[;程序編號] [(參數#1,…參數#1024)] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS 程序行 其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數 (SQL Server 7.0以上版本),參數的使用方法如下: @參數名 數據類型 [VARYING] [=內定值] [OUTPUT] 每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。 [=內定值]相當於我們在建立資料庫時設定一個欄位的默認值,這里是為這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數,同時也需要在結果中輸出的,則該項必須為OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。 例子: CREATE PROCEDURE order_tot_amt @o_id int, @p_tot int output AS SELECT @p_tot = sum(Unitprice*Quantity) FROM orderdetails WHERE ordered=@o_id GO 例子說明: 該例子是建立一個簡單的存儲過程order_tot_amt,這個存儲過程根據用戶輸入的定單ID號碼(@o_id),由定單明細表 (orderdetails)中計算該定單銷售總額[單價(Unitprice)*數量(Quantity)],這一金額通過@p_tot這一參數輸出給調用這一存儲過程的程序。
編輯本段實例
資料庫存儲過程
資料庫存儲過程的實質就是部署在資料庫端的一組定義代碼以及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(單位名稱) CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output as declare @stop int declare @result varchar(80) declare @dwmc varchar(80) declare @dwid int set nocount on set @stop=1 set @dwmc="" select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold set @result=rtrim(@dwmc) if @dwid=0 set @stop=0 while (@stop=1) and (@dwid<>0) begin set @dwidold=@dwid select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold if @@rowcount=0 set @dwmc="" else set @result=@dwmc+@result if (@dwid=0) or (@@rowcount=0) set @stop=0 else continue end set @dwmcresult=rtrim(@result) 使用exec pro-name [pram1 pram2.....]
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 使用EXECUTE 語句來實現對存儲過程的調用。 語法: EXEC[UTE] procere_name( parameter1, parameter2…); 3.開發過程 目前的幾大資料庫廠商提供的編寫存儲過程的工具都沒有統一,雖然它們的編寫風格有些相似,但由於沒有標准,所以各家的開發調試過程也不一樣。下面編寫PL/SQL存儲過程、函數、包及觸發器的步驟如下: 3.1 編輯存儲過程源碼使用文字編輯處理軟體編輯存儲過程源碼,要用類似WORD 文字處理軟體進行編輯時,要將源碼存為文本格式。 3.2 對存儲過程程序進行解釋在SQLPLUS或用調試工具將 存儲過程程序進行解釋; 在SQL>下調試,可用start 或get 等Oracle命令來啟動解釋。如: SQL>start c:\stat1.sql 如果使用調試工具,可直接編輯和點擊相應的按鈕即可生成存儲過程。[1] 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 用戶的存儲過程、函數的源代碼存在錯誤的信息字典
⑧ 存儲過程中很多IS 是干什麼的
不是sql server吧
sql server的sp里沒有看到IS啊!
⑨ 關於存儲過程的 as 和 is 問題
要是換成AS就要改成下面的寫法
CREATE PROCEDURE STUDENT_UPDATE
as
BEGIN
UPDATE STUDENT SET NAME = 'NULL'
WHERE ID IN
(
SELECT ID FROM STUDENT WHERE AGE < 20
);
COMMIT;
END;
go
⑩ oracle存儲過程中的關鍵字is、as究竟有什麼區別呀
1、單獨的FUNCTION, PROCEDURE 習慣用AS,PACKAGE 中的FUNCTION, PROCEDURE 用IS
2、
create [or replace] procere <過程名>
(
<參數1> [方式1] <數據類型1>,
<參數2> [方式2] <數據類型2>
)
is|as
PS/SQL過程體;
單獨的這么看is as 也沒區別