PL/SQL是什么?
今天面试官问我什么是PL/SQL 特来此给大家补习一下基础知识
在我看来是Java和SQL的结合体 类似和Javabase一样的用法
PL/SQL定义变量和Java不一样 PL/SQL定义变量首先需要声明DECLARE
DECLARE
I NUMBER := 1; 定义了一个数字变量 =在Oracle里面相当于等等比较的意思 :=是给其赋值 左边的代码 定义 一个 I 变量为NUMBER 赋值1;
还可以使用 SELECT INTO 语句进行赋值
Oracle的一些基本数据
编写PL/SQL语句的基本介绍
PL/SQL循环的写法
PL/SQL死循环的写法:
PL/SQL WHILE的写法:
PL/SQL foreace循环的写法:
在Oracle里面叫for循环 我感觉和java里的foreace循环差不多 所以我叫foreace循环
PL/SQL函数FUNCTINO的创建和基本使用:PL/SQL游标 CURSOR 的创建和基本介绍
--游标 cursor (相当于java里面我们使用的结果集)
DECLARE
CURSOR MYC IS SELECT ENAME FROM EMP;--定义了一个游标 名字叫 MYC 将emp表的名字数据装的了里面
MY_NAME EMP.ENAME%TYPE;--定义一个装emp表名字的容器 来装游标查询的数据
BEGIN
OPEN MYC;--OPEN打开游标
FETCH MYC INTO MY_NAME;--将数据从游标里面拿到MY_NAME
DBMS_OUTPUT.PUT_LINE(MY_NAME);
CLOSE MYC;--关闭游标
END;
--游标状态
--%FOUND 有表里面有数据
--%NOTFOUND 游标中没有数据
--%ROWCOUNT 受到影响的行数
--%ISOPEN 游标是否打开
--如何拿到游标中的所有数据
--利用循环遍历 游标只能使用foreach遍历
--不需要额外定义变量
--会自动打开和关闭
DECLARE
CURSOR MYC IS SELECT * FROM EMP;
BEGIN
FOR E IN MYC --遍历游标数据
LOOP
DBMS_OUTPUT.PUT_LINE(E.ENAME);--将遍历的名字进行输出
END LOOP;
END;
--显式游标:自己定义的游标 myc myd mye
--隐式游标:隐式游标的名字都叫sql
--DML(增,删,改)会具备一个游标
CREATE TABLE DB_EMP
AS
SELECT * FROM EMP;
-- 将表中的工资少于2000的加上1000
-- 输出收到改变的人数
BEGIN
UPDATE DB_EMP SET SAL=SAL+1000 WHERE SAL<2000;
DBMS_OUTPUT.PUT_LINE('JXRS'||SQL%ROWCOUNT);
END;
--删除表中的员工
--如果没有 则输出没有
BEGIN
DELETE FROM DB_EMP;
IF SQL%ROWCOUNT=0 THEN
DBMS_OUTPUT.PUT_LINE('无了');
END IF;
END;
--动态游标
-- 游标在声明时没有设定,在打开时可以对其进行修改
-- 强类型游标 有return
-- type my_t is ref cursor return xx%rowtype;
-- 弱类型游标 无return
-- type c1 is ref cursor;
-- 动态游标无法使用for循环遍历
--使用强类型游标查看数据
DECLARE
TYPE MYT IS REF CURSOR RETURN EMP%ROWTYPE;--声明一个类型,游标中只能存放EMP类型的行数据
MYE MYT;--一个游标 就是给游标命名
MY_EMP EMP%ROWTYPE;
BEGIN
OPEN MYE FOR SELECT * FROM EMP;--手动指定了sql语句(动态游标)
LOOP FETCH MYE INTO MY_EMP;
EXIT WHEN MYE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(MY_EMP.ENAME);
END LOOP;
CLOSE MYE;
OPEN MYE FOR SELECT * FROM EMP WHERE DEPTNO=20;--手动指定了sql语句(动态游标)
LOOP
FETCH MYE INTO MY_EMP;
EXIT WHEN MYE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(MY_EMP.DEPTNO);
END LOOP;
CLOSE MYE;
END;
-- 使用弱类型游标查看emp,dept表的数据
DECLARE
TYPE MYC IS REF CURSOR;--弱类型就是说 这个游标可以为多表服务
MYT MYC;
MYE EMP%rowtype;
MYD DEPT%rowtype;
BEGIN
OPEN MYT FOR SELECT * FROM EMP;--手动指定了sql语句(动态游标)
LOOP FETCH MYT INTO MYE;
EXIT WHEN MYT%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(MYE.ENAME);
END LOOP;
OPEN MYT FOR SELECT * FROM DEPT;
LOOP FETCH MYT INTO MYD;
EXIT WHEN MYT%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(MYD.DNAME);
END LOOP;
END;