--=====================
-- PL/SQL --> 語言基礎
--=====================
?
??? PL / SQL 是過程化的 SQL 語言,是 ORACLE 對 SQL 語言的擴展,在普通 SQL 語句的基礎上增加了編程語言的特點。使得該語言不僅具有過程編程語
言的特征,如循環、條件分支等。同時也具有對象編程語言的特征,如重載、繼承等。
???
一、 PL / SQL 程序語言的組成
??? 主要由塊組成
??????? 一個塊由三個基本部分組成:聲明、執行體、異常處理
??? ??? PL / SQL 塊有匿名塊和命名塊
??????? 命名塊會將代碼保存到服務器
???????
??? 典型的塊結構如下
??????? [ DECLARE ??????????????????? -- 聲明部分
??????????? declaration_statements
??????? ]
??????? BEGIN
??????????? executable_statements ?? -- 執行體部分
??????? [EXCEPTION
??????????? exception_handling_statements ??? -- 異常處理部分
??????? ]
??????? END ;
??????? /
???
??? PL / SQL 的語言優點
??????? 支持 SQL
??????? 高生成率,性能好
??????? 可移植性
??????? 與 Oracle 集成
???????
二、 PL / SQL 的語法要素
??? PL / SQL 語法要素包括字符集、標識符、文本、分隔符、注釋等。
?
??? 字符集:
??? ? ?? 包括英文大小寫
??????? 0 -數字
??????? 空白符、制表符、空格
??????? 一些特殊符號,如~、!、 @ 、#等
??????? PL / SQL 字符集不區分大小寫
???
??? 標識符:
??????? 變量、常量、子程序的名稱
??????? 以字母開頭、最大長度個字符
??????? 包含空格等特殊符號時,要用英文雙引號括起來
?
??? 文字
??????? 數值型
??????????? 可用常規表示,也可以用科學計數法和冪的形式
??????? 字符型
??????????? 字符型用單引號括起
??????? 日期型
??????? 布爾型
??????????? TRUE 、 FALSE 、 NULL
???????????
??? PL / SQL 的數據類型
??????? NUMBER ???? 數字型能存放整數值和實數值,并且可以定義精度和取值范圍
??????????? DEC ??? 數字型 NUMBER 的子類型,小數
??????????? DOUBLE PRECISION ???? 數字型 NUMBER 的子類型,高精度實數
??????????? INTEGER ??? ? 數字型 NUMBER 的子類型,整數
??????????? INT ???????? 數字型 NUMBER 的子類型,整數
??????????? NUMERIC ??? ? 數字型 NUMBER 的子類型,與 NUMBER 等價
??????????? REAL ?????? ? 數字型 NUMBER 的子類型,與 NUMBER 等價
??? ? ? SMALLINT ??? 數字型 NUMBER 的子類型,取值范圍比 INTEGER 小
??? BINARY_INTEGER ? 數字型可存儲帶符號整數,為整數計算優化性能
??? VARCHAR2 ??????? 字符型存放可變長字符串,有最大長度
??? CHAR ??? ? ??? 字符型定長字符串
??? LONG ??????? 字符型變長字符串,最大長度可達 ,767
??? DATE ??????? 日期型以數據庫相同的格式存放日期值
??? BOOLEAN ??? ? 布爾型 TRUE OR FALSE
??? ROWID ROWID 存放數據庫的行號
??????? LOB 類型,又分為 BFILE , BLOB , CLOB , NCLOB
???????
??? 操作符
??????? 算術運算符
??????????? +、-、 * 、/、 **
?
??????? 比較運算符
??????????? =、 <> 、 ~= 、 != 、 ^= 、 < 、 <= 、 > 、 >=
?
??????? 其它分隔符
??????????? () 、 := ( 賦值 ) 、, ( 表表項的分隔)、 | | (字符串連接)
??????????? << (標號開始) >> ( 標號的結束 )
??????????? -- ? 單行注釋
??????????? /* ??? */ ??? 多行注釋
??? ??????? % ?? 屬性指示器,一般與 TYPE 、 ROWTYPE 等一起用
???????
三、定義變量
??? 變量的類型可以分為
??????? 標量類型
??????? 復合類型
??????? 參照類型
??????? LOB 類型
???
??? 1. 標量類型 ( 常用 )
??????? varchar2(n),char(n),number(p,s),date,timestamp,long(long raw),boolean,binary_integer,binary_float,binary_double
??????? 定義方法 ( 定義時必須使用標量類型 )
??????????? identifier [constant] datatype [not null] [:= | default expr]
??????? v_ename ???? varchar2 ( 20 );
??????? v_sal ?????? number ( 6 , 2 );
??????? c_tax_rate ? constant number ( 3 , 2 ):= 3.35 ;
??????? v_hiredate ? date ;
??????? v_valid ???? boolean not null default false;
???????
??????? v_ename emp.ename%type; ??? -- 使用表列來定義數據類型
??????? v_sal ? ? emp . sal%type ;
???????
??? 2. 復合類型 ( 存放多個值的變量 )
??????? plsql 中包含 pl / sql 記錄, pl / sql 表,嵌套表, varray 四種復合類型
??????? -- 定義 PL/SQL 記錄
??????????? declare
??????????????? type emp_record_type is record (
??????????????????? name ?????? emp . ename % type ,
??????????????????? salary ???? emp . sal % type ,
??????????????????? title ????? emp . job % type );
??????????????? emp_record emp_record_type ;
??????????? begin
??????????????? select ename , sal , job into emp_record
??????????????? from scott . emp where empno = 7788 ;
??????????????? dbms_output . put_line ( 'Employee Name: ' || emp_record . name );
??????????? end ;
??????????? /
???????????
??????? -- 定義 PL/SQL 表
??????????? declare
??????????????? type ename_table_type is table of emp . ename % type
??????????????? index by binary_integer ;
??????????????? ename_table ename_table_type ;
??????????? begin
??????????????? select ename into ename_table (- 1 ) from scott . emp
??????????????? where empno = 7788 ;
??????????????? dbms_output . put_line ( 'Employee Name : ' || ename_table (- 1 ));
??????????? end ;
??????????? /
??????????? PL / SQL 表類似于高級語言中的數組 , 且 PL / SQL 表的下表可以為負值 , 元素的個數沒有限制 . 注意必須首先定義 PL / SQL 表類型及表變量
??????????? 在本例中 , ename_table_type 為表類型 , 表類型中元素的數據類型為 emp . ename % type ,
??????????????? ename_table 為表變量 , ename_table (- 1 ) 表示下標為 - 1 的元素
???????
??????? -- 嵌套表, varray 例子略
???????
??? 3. 參照類型變量
??????? 用于存放數值指針的變量。通常包括游標變量 ( REF CURSOR ) 和對象類型變量 ( REF obj_type )
??? 4.LOB 變量
??????? 存儲大批量數據的變量,通常分為內部 LOB 以及外部 LOB
??? 5. 使用 SQL * Plus 變量
??????? 必須首先使用 variable 命令定義變量,如在 SQL * Plus 中輸出變量,則使用 print variable_name
??????????? scott@ORCL > var name varchar2 ( 20 );
??????????? scott@ORCL > begin
??????????? ? 2 ? select ename into : name from emp where empno = 7788 ;
??????????? ? 3 ? end ;
??????????? ? 4 ? /
?
??????????? PL / SQL procedure successfully completed .
?
??????????? scott@ORCL > print name ;
?
??????????? NAME
??????????? --------------------------------
??????????? SCOTT ??????
?
三、 PL / SQL 中常用的變量賦值方式
??? 1. 在定義時賦值
??????? v_empno ???? number := 7788
??????? c_tax_rate ? constant number ( 3 , 2 ):= 3.35 ;
???
??? 2. 使用 select ... into 來賦值
??????? SELECT expression INTO var_list FROM table_name WHERE condition
???????
??????? -- 例:將號部門的名稱和工作地點顯示出來
?
??????????? DECLARE
??????????????? v_name dept . dname % TYPE ;
??????????????? v_loc ?? dept . loc % TYPE ;
??????????? BEGIN
??????????????? select dname , loc INTO v_name , v_loc FROM dept WHERE deptno = 10 ;
??????????????? DBMS_OUTPUT . PUT_LINE ( '10 DEPT NAME: ' || v_name );
??????????????? DBMS_OUTPUT . PUT_LINE ( '10 DEPT loc: ' || v_loc );
??????????? EXCEPTION
??????????????? WHEN NO_DATA_FOUND THEN
??????????????????? DBMS_OUTPUT . PUT_LINE ( 'NOT FOUND RECORD' );
??????????? END ;
??????????? /
?
??????? -- 例:輸入員工編號,查詢員工姓名,職位,工資
???????
??????????? scott@ORCL > DECLARE
??????????? ? 2 ????????? v_name ? emp . ename % TYPE ;
??????????? ? 3 ????????? v_job ?? emp . job % TYPE ;
??????????? ? 4 ????????? v_sal ? emp . sal % TYPE ;
??????????? ? 5 ????????? v_id ??? emp . empno % TYPE ;
??????????? ? 6 ??????? BEGIN
??????????? ? 7 ????????? v_id :=& inputid ;
??????????? ? 8 ????????? SELECT ename , job , sal INTO v_name , v_job , v_sal FROM emp WHERE empno = v_id ;
??????????? ? ? 9 ????????? DBMS_OUTPUT . PUT_LINE ( '7788 NAME:' || v_name );
??????????? ? 10 ????????? DBMS_OUTPUT . PUT_LINE ( '7788 job:' || v_job );
??????????? ? 11 ????????? DBMS_OUTPUT . PUT_LINE ( '7788 sal:' || v_sal );
??????????? ? 12 ??????? EXCEPTION
??????????? ? 13 ????????? WHEN NO_DATA_FOUND THEN
??????????? ? 14 ??????????? DBMS_OUTPUT . PUT_LINE ( 'NOT FOUND RECORD!' );
??????????? ? 15 ??????? END ;
??????????? ? 16 ? /
??????????? Enter value for inputid : 7788
??????????? old ?? 7 : ???????? v_id :=& inputid ;
??????????? new ?? 7 : ???????? v_id := 7788 ;
??????????? 7788 NAME : SCOTT
??????????? 7788 job : ANALYST
??????????? 7788 sal : 3000
?
??????????? PL / SQL procedure successfully completed .
???????
???????
???????????
??????? -- 例:執行 UPDATE
??????????? scott@ORCL > DECLARE
??????????? ? 2 ??????? v_sal emp . sal % TYPE ;
??????????? ? 3 ??????? old_sal emp . sal % TYPE ;
??????????? ? 4 ??????? v_id emp . empno % TYPE ;
??????????? ? 5 ????? BEGIN
??????????? ? 6 ??????? v_sal :=& inputsal ;
??????????????? ? v_id :=& inputid ;
??????????? ? 7 ??????? v_id :=& inputid ;
??????????? ? 8 ??????? SELECT sal INTO old_sal FROM emp WHERE empno = v_id ;
??????????? ? 9 ??????? UPDATE emp SET sal = v_sal WHERE empno = v_id ;
??????????? ? 10 ??????? DBMS_OUTPUT . PUT_LINE ( 'old sal:' || old_sal );
??????????? ? 11 ??????? DBMS_OUTPUT . PUT_LINE ( 'new sal:' || v_sal );
??????????? ? 12 ????? END ;
??????????? ? 13 ????? /
??????????? Enter value for inputsal : 3500
??????????? old ?? 6 : ?????? v_sal :=& inputsal ;
??????????? new ?? 6 : ?????? v_sal := 3500 ;
??????????? Enter value for inputid : 7788
??????????? old ?? 7 : ?????? v_id :=& inputid ;
??????????? new ?? 7 : ?????? v_id := 7788 ;
??????????? old sal : 3000
??????????? new sal : 3500
?
??? ??????? PL / SQL procedure successfully completed .
?
四、更多參考
?
??? 有關 SQL 請參考 ?
??????? SQL 基礎--> 子查詢
??????? SQL 基礎--> 多表查詢
SQL 基礎--> ROLLUP 與CUBE 運算符實現數據匯總
SQL 基礎--> 層次化查詢(START BY ... CONNECT BY PRIOR)
?
??? 有關 PL/SQL 請參考
??????? PL/SQL --> 語言基礎
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
