国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

過程,函數,程序包

2024-07-21 02:40:15
字體:
來源:轉載
供稿:網友
過程,函數,程序包 之前學習的PL/SQL塊是匿名的,不能將其存儲到數據庫中。我們可以命名我們的PL/SQL塊,并為他們確定參數,存儲在數據庫中。這樣可以從任何數據庫客戶端或者工具引用和運行他們,比如SQL*PLUS, PRo*C, JDBC。這些命名的PL/SQL塊成為存儲過程和函數,他們的集合成為程序包。 優點:1.  可重用性:一旦命名并保存在數據庫中后,任何應用都可以2.  抽象和數據隱藏3.  安全性 過程存儲過程就是命了名的PL/SQL塊,可以被賦予參數,存儲在數據庫中,然后由另一個應用或者PL/SQL例程調用。比如CREATE PROCEDURE my_proc as BEGIN       NULL;END;/ 語法:CREATE [OR REPLACE] PROCEDURE procedure_name (參數)IS AS[PRAGMA AUTONOMOUS_TRANACTION;]  --聲明自主事務處理。[本地變量聲明]BEGIN       執行語句部分[EXCEPTION]       錯誤處理部分END[name];/ CREATE OR REPLACE PROCEDURE my_proc as           -- OR REPLACEBEGIN       Dbms_output.put_line(‘Hello, world’);END;/
 執行存儲過程set serveroutput onbegin       my_procend;/ 直接執行:execute my_procexec my_proc 權限:表和視圖具有SELECT, INSERT, UPDATE, DELETE 這樣的特權,而過程具有EXECUTE特權。只有將EXECUTE 特權賦予用戶,用戶才可以運行它。而將它賦予PUBLIC用戶,則所有用戶都可以運行。 [試驗]創建3個用戶conn donny/donnycreate user chris identified by chris;此時不能連結數據庫,不能創建過程 grant connect, resource to chris;create user sean identified by sean;grant connect, resource to sean;create user mark identified by mark;grant connect, resource to mark; 使用mark建立一個過程conn mark/mark create procedure marks_proc as begin       null;end;/ 嘗試使用chris用戶執行這個過程:conn chris/chrisexec mark.marks.proc 授權:conn mark/mark grant execute on marks_proc to chris
 conn chris/chrisexec mark.marks_proc 嘗試使用sean用戶執行這個過程:conn sean/seanexec mark.marks.proc 將execute 授予public用戶,使得所有用戶都可以執行這個過程conn mark/markgrant execute on marks_proc to public; conn sean/seanexec mark.marks.proc  參數:過程可以進行參數化處理,可以為任何合法的PL/SQL類型,有三種模式:IN, OUT, IN OUT IN 參數通過調用者傳入,只能由過程讀取,不能改變。是默認的模式,可以具有默認值。OUT 參數有過程寫入。用于過程需要向調用者返回多條信息的時候。不能是具有默認值的變量,也不能是常量,必須向OUT參數傳遞返回值。IN OUT 具有兩者的特性,可以讀取和寫入。 IN參數:Create table t(n number); Create or replace procedure insert_into_t (p in number ) isbegin       insert into t values(p);end insert_into_t;/ 這個時候并沒有執行該過程,嘗試執行select * from t;exec insert_into_t (p=> 100);select * from t; 例子2drop table t;Create table t(n number,p varchar2(20));
 Create or replace procedure insert_into_t (p1 in number, p2 in number) isbegin       insert into t values(p1,’p1’);       insert into t values(p2,’p2’);end insert_into_t;/ 這個時候并沒有執行該過程,嘗試執行select * from t;exec insert_into_t (p1=> 100, p2=>200);select * from t; 參數傳遞方法:1.  使用名稱表示exec insert_into_t (p2=> 101, p1=>201); 2.  使用位置表示exec insert_into_t (102, 202); 3.  使用混合表示適用于有默認值的情況,注重:OUT 和 IN OUT 參數不能有默認值CREATE OR REPLACE procedure default_values(       P1 varchar2,       P2 varchar2 default ‘Chris’,       P3 varchar2 default ‘Sean’) asBegin       Dbms_output.put_line(p1);       Dbms_output.put_line(p2);       Dbms_output.put_line(p3);End default_values;/
 只想傳入1,3參數:set serveroutput onexec default_values(‘Tom’, p3=>’Joel’);  OUT 參數:從過程向調用者返回值:例子:使用scott.emp表,編寫搜索過程,輸入empno,返回ename , sal分析:desc scott.emp參數:一個in, 兩個out參數類型:in number, out emp.ename%type , out emp.sal%type  con scott/tiger create or replaceprocedure emp_lookup(       p_empno in number,       o_ename out emp.ename%type , o_sal      out emp.sal%type) asbegin       select ename, sal               into o_ename, o_sal       from emp       where empno= p_empno;exception       when NO_DATA_FOUND then              o_ename := ‘null’;              o_sal := -1;end;/
  執行該過程:1.  使用匿名PL/SQL分析:目的是輸出兩個out參數的結果,所以匿名塊中也要定義2個與out參數相同的局域變量。 set serveroutput on declare       l_ename emp.ename%type;       l_sal       emp.sal%type;begin       emp_lookup(7782, l_ename, l_sal);       dbms_output.put_line(‘Ename = ‘ l_ename);       dbms_output.put_line(‘Sal = ‘ l_sal);end;/ 2.  在sql plus 中執行分析:需要使用sql plus 的VARIABLE命令綁定參數值,即為OUT參數提供接受返回值的變量。 Variable name varchar2(10);Variable sal number; Exec emp_lookup(‘7782’, :name, :sal);Print name;Print sal;Select :name, :sal from dual;  IN OUT 參數:可以用來傳入參數,并從存儲過程返回值。 例子:輸入兩個數,交換值思路:通過一個臨時變量作為交換過程中的過渡create or replace procedure swap(       p1 in out number,       p2 in out number ) asl_temp number;             --局域變量的聲明,相當于匿名塊中declare之后的聲明;過程:as~beginbegin              l_temp := p1;       p1 := p2;       p2 := l_temp;end swap;/
 set serveroutput ondeclare       l1 number:=100;       l2 number:=200;begin       swap(l1,l2);       dbms_output.put_line(‘l1 = ‘ l1);       dbms_output.put_line(‘l2 = ‘ l2);end;/ 關于自主事務處理: P197我們曾經討論過COMMIT 和 ROLLBACK的概念。 建立過程P2:CREATE OR REPLACE PROCEDURE P2 AS        A varchar2(50);Begin       Select venadd1 into a from vendor_master where vencode=’V002’;       Dbms_output.put_line(a);       ROLLBACK;END;/ 建立過程P1,調用P2:CREATE OR REPLACE PROCEDURE P1 AS        B varchar2(50);Begin       Update vendor_master set venadd1=’10 Walls Street ‘ where vencode=’V002’;       P2();       Select venadd1 into b from vendor_master where vencode=’V002’;       Dbms_output.put_line(b);       ROLLBACK;END;/
 exec p1說明事務處理可以跨越過程繼續執行。 為了防止一個過程影響其他過程,可以將其標記為自主的。這樣p2中的rollback將不會影響p1 CREATE OR REPLACE PROCEDURE P2 AS        A varchar2(50);PRAGMA AUTONOMOUS_TRANSACTION;Begin       Select venadd1 into a from vendor_master where vencode=’V002’;       Dbms_output.put_line(a);       ROLLBACK;END;/ EXEC P1;  函數:與過程相似,遵循了相同的規則。參數傳遞:只能帶有in參數,不能使用out, in out 參數函數的主要特性是必須返回一個值。 語法:CREATE [OR REPLACE] FUNCTION function_name (
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴堡县| 鞍山市| 二连浩特市| 广河县| 阳高县| 涞水县| 沽源县| 凭祥市| 囊谦县| 馆陶县| 乃东县| 绥化市| 江口县| 元江| 黄骅市| 讷河市| 北碚区| 化隆| 鞍山市| 小金县| 皮山县| 长治市| 沙雅县| 宝应县| 屏东县| 肥东县| 广汉市| 垦利县| 平遥县| 金秀| 灵璧县| 广东省| 新疆| 广汉市| 垣曲县| 龙游县| 富源县| 金山区| 乌海市| 阿鲁科尔沁旗| 天等县|