一、PLSQL的简介

什么是PL/SQL?

PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点。

  • PL/SQL是面向过程的语言
  • PL/SQL是对SQL语言的扩展

PL/SQL的特点:

  • PL/SQL是Oracle系统的核心语言,现在Oracle许多部件都是由PL/SQL写成的
  • PL/SQL具有简单、高效、灵活、实用的特点

不同数据库对SQL的扩展:

Oracle:PL/SQL

SQL Server:Transac-SQL(T-SQL)

二、PLSQL的引用型变量和记录型变量

引用型变量:是指其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同。

记录型变量:PL/SQL提供%ROWTYPE操作符,返回一个记录类型,其数据类型和数据库表的数据结构相一致。

 --引用型变量 DECLARE     v_name  emp.ename%TYPE;     v_sal   emp.sal%TYPE; BEGIN     SELECT ename,sal     INTO   v_name,v_sal     FROM   emp     WHERE  empno = 7788;     --打印输出     DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal); END;  --记录型变量 DECLARE     emp_record   emp%ROWTYPE; BEGIN     SELECT *  INTO emp_record FROM emp WHERE empno = 7788;     --打印输出     DBMS_OUTPUT.PUT_LINE(emp_record.ename||'的工资是:'||emp_record.sal); END; 

三、PLSQL的运算符

 --算术运算符 DECLARE     v_num1   NUMBER(3):=10;     v_num2   NUMBER(3):=2; BEGIN     DBMS_OUTPUT.PUT_LINE(v_num1+v_num2);     DBMS_OUTPUT.PUT_LINE(v_num1-v_num2);     DBMS_OUTPUT.PUT_LINE(v_num1*v_num2);     DBMS_OUTPUT.PUT_LINE(v_num1/v_num2);     DBMS_OUTPUT.PUT_LINE(v_num1**v_num2); END;  --关系运算符 DECLARE     v_num1  NUMBER(2) := &n1;     v_num2  NUMBER(2) := &n2; BEGIN     IF (v_num1 = v_num2) THEN           DBMS_OUTPUT.PUT_LINE('num1等于num2');     ELSIF(v_num1 < v_num2) THEN           DBMS_OUTPUT.PUT_LINE('num1小于num2');     ELSIF(v_num1 > v_num2) THEN           DBMS_OUTPUT.PUT_LINE('num1大于num2');     END IF;          IF (v_num1 <> v_num2) THEN           DBMS_OUTPUT.PUT_LINE('num1不等于num2');     END IF; END;  --比较运算符 DECLARE   --&n1是替代变量,在执行程序时会提示输入值     v_num1  NUMBER(2):= &n1; BEGIN     IF(v_num1 BETWEEN 5 AND 10 )THEN               DBMS_OUTPUT.PUT_LINE('num1在5到10之间');     ELSE               DBMS_OUTPUT.PUT_LINE('num1不在5到10之间');     END IF;          IF(v_num1 IN(3,8,10) )THEN               DBMS_OUTPUT.PUT_LINE('num1等于3,8,10中的一个值');     ELSE               DBMS_OUTPUT.PUT_LINE('num1不等于3,8,10中的一个值');     END IF;          IF(v_num1 IS NULL)THEN               DBMS_OUTPUT.PUT_LINE('num1为空');     ELSE               DBMS_OUTPUT.PUT_LINE('num1不为空');     END IF; END;  --逻辑运算符 DECLARE     v_b1  BOOLEAN  := &n1;     v_b2  BOOLEAN  := &n2; BEGIN     IF(v_b1 AND v_b2)THEN             DBMS_OUTPUT.PUT_LINE('AND--TRUE');     END IF;          IF(v_b1 OR v_b2)THEN             DBMS_OUTPUT.PUT_LINE('OR--TRUE');     END IF;          IF(NOT v_b1)THEN             DBMS_OUTPUT.PUT_LINE('v_b1取反为TRUE');     END IF; END; 

四、PL/SQL编程

EXIT和EXIT WHEN语句:

  • EXIT语句用于直接退出当前循环
  • EXIT WHEN语句用于在满足特定条件时退出当前循环

CONTINUE和COUTINUE WHEN语句:

  • COUTINUE语句是Oracle11g的新特性,用于直接结束当前循环并继续下一组循环。
  • COUTINUE WHEN语句用于在满足特定条件时结束当前循环语句并继续下一组循环语句。

GOTO语句:用于跳转到特定标号处执行语句。当使用GOTO跳转到特定标号时,标号后至少要包含一条执行语句。

NULL语句:NULL语句不会执行任何操作,并且会直接将控制传递到下一个语句,使用该语句的主要目的是提高PL/SQL块的可读性。

 --输入员工号,判断员工工资, 显示工资小于3000的员工姓名及工资。 --简单的IF语句 DECLARE       v_name  emp.ename%TYPE;       v_sal   emp.sal%TYPE; BEGIN       SELECT ename,sal       INTO   v_name,v_sal       FROM   emp       WHERE  empno = &no;       IF   v_sal <3000 THEN            DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);       END IF; END;   SELECT * FROM emp;  --输入员工号,判断员工工资,将工资小于3000的员工工资涨200,并显示涨工资的员工姓名,其他员工显示员工姓名及工资。 --二重分支语句 DECLARE        v_name    empnew.ename%TYPE;        v_sal     empnew.sal%TYPE;        v_empno   empnew.empno%TYPE := &no; BEGIN        SELECT ename,sal        INTO   v_name,v_sal        FROM   empnew        WHERE  empno = v_empno;        IF  v_sal <3000 THEN            UPDATE empnew set sal = sal + 200 where empno = v_empno;            COMMIT;            DBMS_OUTPUT.put_line(v_name||'涨工资了');        ELSE            DBMS_OUTPUT.put_line(v_name||'的工资是:'||v_sal);        END IF; END;     select * from empnew;   --输入员工号,判断员工工资, 工资小于2000,显示低收入,工资小于6000,显示中等收入,其它显示高收入。 --多重分支语句 DECLARE        v_name    empnew.ename%TYPE;        v_sal     empnew.sal%TYPE;         BEGIN        SELECT ename,sal        INTO   v_name,v_sal        FROM   empnew        WHERE  empno = &no;        IF v_sal<2000  THEN           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于低收入');        ELSIF v_sal<6000  THEN           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于中等收入');        ELSE           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于高收入');        END IF;        END;     /* --输入员工号,判断员工工资, 显示工资小于3000的员工姓名及工资。 --简单的IF语句 DECLARE       v_name  emp.ename%TYPE;       v_sal   emp.sal%TYPE; BEGIN       SELECT ename,sal       INTO   v_name,v_sal       FROM   emp       WHERE  empno = &no;       IF   v_sal <3000 THEN            DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal);       END IF; END;   SELECT * FROM emp;  --输入员工号,判断员工工资,将工资小于3000的员工工资涨200,并显示涨工资的员工姓名,其他员工显示员工姓名及工资。 --二重分支语句 DECLARE        v_name    empnew.ename%TYPE;        v_sal     empnew.sal%TYPE;        v_empno   empnew.empno%TYPE := &no; BEGIN        SELECT ename,sal        INTO   v_name,v_sal        FROM   empnew        WHERE  empno = v_empno;        IF  v_sal <3000 THEN            UPDATE empnew set sal = sal + 200 where empno = v_empno;            COMMIT;            DBMS_OUTPUT.put_line(v_name||'涨工资了');        ELSE            DBMS_OUTPUT.put_line(v_name||'的工资是:'||v_sal);        END IF; END;     select * from empnew;   --输入员工号,判断员工工资, 工资小于2000,显示低收入,工资小于6000,显示中等收入,其它显示高收入。 --多重分支语句 DECLARE        v_name    empnew.ename%TYPE;        v_sal     empnew.sal%TYPE;         BEGIN        SELECT ename,sal        INTO   v_name,v_sal        FROM   empnew        WHERE  empno = &no;        IF v_sal<2000  THEN           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于低收入');        ELSIF v_sal<6000  THEN           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于中等收入');        ELSE           DBMS_OUTPUT.PUT_LINE(v_name||'的工资是:'||v_sal||' 属于高收入');        END IF;        END; */  --输入成级等级,判断属于哪个层次,并打印输出 --CASE 等值比较 DECLARE         v_grade char(1) := '&no'; BEGIN        CASE v_grade             WHEN  'A'  THEN                   DBMS_OUTPUT.PUT_LINE('优秀');             WHEN  'B'  THEN                   DBMS_OUTPUT.PUT_LINE('中等');                  WHEN  'C'  THEN                   DBMS_OUTPUT.PUT_LINE('一般');              ELSE                   DBMS_OUTPUT.PUT_LINE('输入有误');            END CASE;               END;  --输入员工号,获取员工工资,判断工资,如果工资小于1500,补助加100,如果工资小于2500,补助加80,如果工资小于5000,补助加50. --CASE 非等值比较 DECLARE               v_sal     empnew.sal%TYPE;        v_empno   empnew.empno%TYPE := &no; BEGIN        SELECT sal        INTO   v_sal        FROM   empnew        WHERE  empno = &no;        CASE                WHEN v_sal<1500 THEN                    UPDATE empnew set comm = nvl(comm,0)+100 WHERE empno = v_empno;               WHEN v_sal<2500 THEN                    UPDATE empnew set comm = nvl(comm,0)+80 WHERE empno = v_empno;                    WHEN v_sal<5000 THEN                    UPDATE empnew set comm = nvl(comm,0)+50 WHERE empno = v_empno;                      --COMMIT;         END CASE; END;  select * from empnew;     --基本循环 DECLARE     v_cnt INT :=1; BEGIN     LOOP            DBMS_OUTPUT.PUT_LINE(v_cnt);           EXIT WHEN v_cnt = 10;           v_cnt := v_cnt+1;               END LOOP; END;     --while循环 DECLARE     v_cnt INT :=1; BEGIN     WHILE v_cnt<=10 LOOP           DBMS_OUTPUT.PUT_LINE(v_cnt);           v_cnt := v_cnt+1;     END LOOP; END;  --for循环 BEGIN     FOR i  IN REVERSE 1..10 LOOP         DBMS_OUTPUT.PUT_LINE(i);     END LOOP; END;      /* --基本循环 DECLARE     v_cnt INT :=1; BEGIN     LOOP            DBMS_OUTPUT.PUT_LINE(v_cnt);           EXIT WHEN v_cnt = 10;           v_cnt := v_cnt+1;               END LOOP; END;     --while循环 DECLARE     v_cnt INT :=1; BEGIN     WHILE v_cnt<=10 LOOP           DBMS_OUTPUT.PUT_LINE(v_cnt);           v_cnt := v_cnt+1;     END LOOP; END;  --for循环 BEGIN     FOR i  IN REVERSE 1..10 LOOP         DBMS_OUTPUT.PUT_LINE(i);     END LOOP; END; */   --嵌套循环 DECLARE     v_result INT; BEGIN     <<outter>>     FOR i IN 1..5 LOOP         <<inter>>         FOR j IN 1..5 LOOP           v_result:=i;           EXIT outter WHEN i=4;         END LOOP inter;         DBMS_OUTPUT.PUT_LINE('内'||v_result);      END LOOP outter;      DBMS_OUTPUT.PUT_LINE('外'||v_result); END;  --CONTINUE DECLARE     v_cnt INT :=0; BEGIN     LOOP               v_cnt := v_cnt+1;              CONTINUE WHEN v_cnt = 5;              DBMS_OUTPUT.PUT_LINE(v_cnt);              EXIT WHEN v_cnt = 10;          END LOOP; END;      --GOTO语句 DECLARE   v_cnt INT := 1; BEGIN   LOOP     DBMS_OUTPUT.PUT_LINE(v_cnt);     IF v_cnt=10 THEN        --EXIT;        GOTO end_loop;     END IF;     v_cnt := v_cnt + 1;    END LOOP;    <<end_loop>>    DBMS_OUTPUT.PUT_LINE('循环结束'); END;  --NULL语句 DECLARE    v_sal empnew.sal%TYPE;    v_name empnew.ename%TYPE; BEGIN   SELECT ename,sal    INTO v_name,v_sal   FROM empnew   WHERE empno = &no;   IF v_sal<3000 THEN     UPDATE empnew set comm = nvl(comm,0)+sal*0.2 WHERE ename=v_name;     COMMIT;     DBMS_OUTPUT.PUT_LINE(v_name||'的奖金更新了');   ELSE     NULL;   END IF; END;  select * from empnew; 

 

  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论