PL SQL 第3章 包 的示例

2021-06-06 12:40:12 字數 2470 閱讀 4217

第3章 包

/**建立包規範**/

create package emp_pkg is

procedure update_sal(name varchar2,newsal number);

function income(name varchar2) return number;

end;

/**建立包體**/

create package body emp_pkg is

procedure update_sal(name varchar2,newsal number)

isbegin

update emp set sal=newsal where lower(ename)=lower(name);

end;

function income(name varchar2) return number

issalary number(7,2);

begin

select sal*12+nvl(comm,0) into salary from emp where lower(ename)=lower(name);

return salary;

end;

end;

select * from emp where lower(ename)='scott';

/***呼叫儲存和函式******/

call emp_pkg.update_sal('scott',1500);

sql> var income number

sql> call emp_pkg.income('scott') into :income;

呼叫完成。

sql> print income;

income

----------

36000

/************建立觸發器**************/

下面的觸發器在更新表tb_emp之前觸發,目的是不允許在周二修改表:

觸發器已建立

sql> insert into dept(deptno,dname) values (90,'luowj');

insert into dept(deptno,dname) values (90,'luowj')

*第 1 行出現錯誤:

ora-20600: 不能在周二修改dept

ora-06512: 在 "scott.update_dept", line 3

ora-04088: 觸發器 'scott.update_dept' 執行過程中出錯

sql> show errors;

沒有錯誤。

/************%type用法和作用***************/

declare

v_ename varchar2(5);

v_sal number(6,2);

c_tax_rate constant number(3,2):=0.03;

v_tax_sal number(6,2);

begin

select ename,sal into v_ename,v_sal from emp where empno=&no;

v_tax_sal:=v_sal*c_tax_rate;

dbms_output.put_line('雇員名:'||v_ename);

dbms_output.put_line('雇員工資:'||v_sal);

dbms_output.put_line('所得稅:'||v_tax_sal);

end;

select * from emp where empno='7788';

/**varchar2把所有字元都佔兩位元組處理(一般情況下)**/

select * from emp where empno='7744';如是填no值的時候是7844,就會報字串緩衝區太小,原因ename列

最大長度為10位元組,只能儲存5個字元

下面是用%type屬性 解決如上的問題

/* 當使用%type屬性定義變數時,它會按照資料庫列或其他變數來確定新變數的型別和長度*/

declare

v_ename emp.ename%type;

v_sal emp.sal%type;

c_tax_rate constant number(3,2):=0.03;

v_tax_sal v_sal%type;

begin

select ename,sal into v_ename,v_sal from emp where empno=&eno;

v_tax_sal:=v_sal*c_tax_rate;

dbms_output.put_line('雇員名:'||v_ename);

dbms_output.put_line('雇員工資:'||v_sal);

dbms_output.put_line('所得稅:'||v_tax_sal);

end;

PLSQL入門與精通(第33章 包的本質)

我們一直在列舉說明pl sql的包的用途。但是包的本質是什麼的?個人理解,pl sql包的本質就是 全區域性 換句話來講全域性使用的東西,需要在包來定義。一般來說,在無名塊 或者過程和函式的本地定義部中定義的內容只能在本pl sql塊中使用。從這個意義上來說,這是乙個本地 區域性 的定義部。所謂本地...

第3章 函式

變數本質上是佔位符 def 函式名 引數1,引數2,引數n 函式體 語句塊 這裡的引數沒有型別,只有物件才有型別。python中為物件編寫介面,而不是為資料型別編寫。result add 3,4 add x,y 被執行之前,在計算機內是不存在的,直到 執行到這裡的時候,在計算機中就建立起來了乙個物件...

第3章 模板

這章主要將一些jinja2的頁面模板,個人覺得這種輪子或者黑盒的使用不必太過仔細,必要的時候再記就行了。3.4 鏈結 這種引入了url rof 函式,其作用是傳入檢視函式的名字,以及一些引數,生產對應的url鏈結 1 例如 url rof index external true http local...