当前位置:   article > 正文

PL/SQL 数据类型与基本输出_plsql 输出

plsql 输出

一.PL/SQL

1.什么是PLSQL

PROCEDURE LANGUAGE/SQL

PL/SQL 是使用sql的数据库编程语言,也是面向程序的程序语言

相比于SQL sql是声明语句 而 PL/SQL是程序语言(有执行体、循环体、结构体)

同时PL/SQL 不与数据库进行交互

用于编写 程序、触发器、函数、包

2.PLSQL数据类型

  1. 1.PL/SQL 数据类型:变量常量 生命周期
  2. --变量数据类型分类 6种 number varchar2 date
  3. --剩余三种是新类型 : 引用类型:V_NAME TABLE.COLUMN_NAME%TYPE
  4. --记录型 自定义型: TYPE T_NAME IS RECORD(COLUMN_NAME DATA_TYPE,...);
  5. --行记录型: V_NAME TABELE_NAME%ROWTYPE;
  6. 其次是常量 constant
  7. 当我们定义变量时规范以V_ 开头 定义变量以C_ 开头
  8. --当我们定义常量时:需要添加关键字CONSTANT
  9. DECLARE
  10. C_TEST CONSTANT NUMBER(16) := 6666;
  11. BEGIN
  12. DBMS_OUTPUT.PUT_LINE(C_TEST);
  13. C_TEST :=9999;
  14. DBMS_OUTPUT.PUT_LINE(C_TEST);
  15. END;--这里会报错 C_TEST不能作为赋值对象,我们看看变量可以复制吗
  16. DECLARE
  17. C_TEST1 NUMBER(16) := 6666;
  18. BEGIN
  19. DBMS_OUTPUT.PUT_LINE(C_TEST1);
  20. C_TEST1 :=9999;
  21. DBMS_OUTPUT.PUT_LINE(C_TEST1);
  22. END;--这里可以看到 变量可以正常重新赋值
  1. 2.PL/SQL变量详解
  2. --首先是ORACLE 自带的三种数据类型
  3. DECLARE
  4. V_CHAR VARCHAR2(20) :='SUN';
  5. V_NUM NUMBER(10) :=66;
  6. V_DATE DATE :=TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD');
  7. BEGIN
  8. DBMS_OUTPUT.PUT_LINE(V_CHAR);
  9. DBMS_OUTPUT.PUT_LINE(V_NUM);
  10. DBMS_OUTPUT.PUT_LINE(TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD'),'YYYY/MM/DD'));
  11. END;
  12. --可以看到都成功打印 但是这种方式都写的是死值 只是举例用 这种变量并不好用 当数据改变 数据也需要重写 所以出现了引用类型变量
  13. --日期格式 DD/M月/YY
  14. --在上面的例子中,我们可以看到在赋值语句,这样的数据类型引用都只能输出单行单列
  1. --其次是新认识的数据类型
  2. 引用型变量
  3. %TYPE
  4. DECLARE
  5. --定义引用型变量
  6. V_TEST2 EMP.EMPNO%TYPE;--值传递
  7. --V_NAME TABLE.COLUMN
  8. --%TYPE
  9. BEGIN
  10. SELECT EMPNO INTO V_TEST2 FROM EMP WHERE ENAME='SMITH';
  11. --值传递
  12. --输出结果
  13. DBMS_OUTPUT.PUT_LINE(V_TEST2);
  14. END;
  15. 上述实例只有一个变量,我们可以操作多个引用性变量吗?
  16. DECLARE
  17. V_TEST2 EMP.EMPNO%TYPE;
  18. V_TEST3 EMP.MGR%TYPE;
  19. BEGIN
  20. SELECT EMPNO,MGR INTO V_TEST2,V_TEST3 FROM EMP WHERE ENAME='SMITH';
  21. DBMS_OUTPUT.PUT_LINE('EMPNO:'||V_TEST2|| 'MGR:'||V_TEST3);
  22. END;
  23. --可以看到多个变量可以同时赋值(值传递)
  1. 行记录型变量
  2. --频繁引用麻烦 也容易出错
  3. --如何记录某张表的某一行的所有数据?
  4. --V_NAME TABELE_NAME%ROWTYPE
  5. DECLARE
  6. V_TEST4 EMP%ROWTYPE;
  7. BEGIN
  8. SELECT * INTO V_TEST4 FROM EMP WHERE EMPNO =7369;
  9. DBMS_OUTPUT.PUT_LINE(V_TEST4.ENAME);--可以输出多个
  10. END;
  11. --这个输出方式不要想着一次性全部输出 必须指定所记录的表的字段名称 并且字符串之间要用连接符号
  12. 在如下表连接中,可以输出所有内容,可以使用行记录型来输出吗?
  13. SELECT E.*, D.* FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
  14. DECLARE
  15. V_EMP EMP%ROWTYPE;
  16. V_DEPT DEPT%ROWTYPE;
  17. BEGIN
  18. SELECT E.*,D.* INTO V_EMP,V_DEPT FROM EMP E,DEPT D WHERE E.DEPTNO=D.DEPTNO AND EMPNO =7369;--ERROR
  19. --报错: 不支持强制放入多个目标
  20. DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
  21. END;
  1. 自定义类型记录变量
  2. TYPE T_NAME IS RECORD(COLUMN_NAME DATA_TYPE)
  3. T_NAME V_NAME (值传递)
  4. DECLARE
  5. TYPE T_TEST IS RECORD(EMPNO NUMBER(10), MGR NUMBER(10));
  6. V_TEST T_TEST;
  7. BEGIN
  8. SELECT EMPNO,MGR INTO V_TEST FROM EMP WHERE ENAME = 'SMITH';
  9. DBMS_OUTPUT.PUT_LINE(V_TEST.EMPNO||V_TEST.MGR);
  10. END;
  11. --自定义型变量又回到了第一种自定义变量 需要设置合适的字段数据类型和大小才可以 不然会报错
  12. --这样还是输出一行 有啥意义
  13. 疑问1:为什么不直接定义一个这样的变量 而是要传递值?
  14. 疑问2:有没有能同时赋值多个字段并且多行赋值的变量?
  15. --意义在于:这种写法可以表连接输出多张表的该数据的所有信息
  16. SELECT * FROM EMP;
  17. declare
  18. type t_ed is record(
  19. EMPNO NUMBER(4),
  20. ENAME VARCHAR2(10),
  21. JOB VARCHAR2(9),
  22. MGR NUMBER(4),
  23. HIREDATE DATE,
  24. SAL NUMBER(7, 2),
  25. COMM NUMBER(7, 2),
  26. eno NUMBER(2),
  27. dno number(2),
  28. dname varchar2(20),
  29. loc varchar2(20));
  30. v_ed t_ed;
  31. begin
  32. select *
  33. into v_ed
  34. from emp e
  35. join dept d
  36. on e.deptno = d.deptno
  37. where empno = 7369;
  38. dbms_output.put_line('员工姓名:'||v_ed.ename||'部门名称:'||v_ed.dname);
  39. end;
  40. --error
  41. declare
  42. type t_ed is record(
  43. v_emp emp%rowtype,
  44. v_dept dept%rowtype);
  45. v_ed t_ed;
  46. begin
  47. select e.*, d.*
  48. into v_ed
  49. from emp e
  50. join dept d
  51. on e.deptno = d.deptno
  52. where empno = 7369;
  53. dbms_output.put_line('员工姓名:' || v_ed.ename || '部门名称:' || v_ed.dname);
  54. end;
  55. --不能强制插入多条数据

3.关于PL/SQL的输出方式

  1. PL/SQL 的打印语法
  2. 与JAVA 的 SYSTEM.OUT.PRINTLN()类似
  3. DBMS_OUTPUT.PUT_LINE()作为PL/SQL的输出语句
  4. 我们可以看到在 DBMS_OUTPUT. 下有很多可选项 这些类型都被称为PROCEDURE 过程(什么是储存过程?)
  5. 其中有PUT_LINE() 和 PUT 两种输出方式
  6. 前者会自动换行
  7. 后者不会
  8. DECLARE
  9. --变量定义可省略
  10. BEGIN
  11. --执行体不可省略
  12. --DBMS_OUTPUT.PUT_LINE('WECHAT');
  13. DBMS_OUTPUT.PUT('QQ');
  14. DBMS_OUTPUT.PUT('WECHAT');
  15. DBMS_OUTPUT.PUT_LINE('');
  16. --我们如果不执行最后一条输出语句 将不会输出任何结果
  17. DBMS_OUTPUT并不是直接将数据执行输出到屏幕
  18. --它首先将数据放到缓冲区 然后读取到换行符 将所有放入的数据重新读回打印 --->缓冲区减少了数据的打印执行次数 提升效率
  19. --所以意思就是说 DBMS_OUTPUT方法下的PUT过程 在编写的时候没有写 换行符 这一步 导致我们只通过PUT打印会没有结果
  20. --所以需要加一行换行来输出
  21. --执行语句可以以NULL代替
  22. --EXCEPETION
  23. --异常可省略
  24. END;--;必须 不可以省略

4.其它

  1. --记录类型 not null
  2. declare
  3. type t_1 is record(
  4. v_ename varchar2(20) not null := 'ALLEN',
  5. v_job varchar2(20));
  6. v_1 t_1;
  7. begin
  8. v_1.v_ename:=null;
  9. end;
  10. --类似于约束,限制变量不能为空值或者'',在添加后需要在定义时就要初始化,否则报错
  11. --键盘输入符 &--自动搜寻功能
  12. select * from emp where deptno=&部门编号;
  13. select * from emp where ename='&员工姓名';
  14. select * from emp where ename='SMITH';
  15. declare
  16. v_emp emp%rowtype;
  17. v_empno number(4):=&员工编号;
  18. begin
  19. select * into v_emp from emp where empno=v_empno;
  20. dbms_output.put_line('员工姓名:'||v_emp.ename);
  21. end;
  22. --
  23. create view v_emp as select * from emp;
  24. declare
  25. v_e v_emp%rowtype;
  26. begin
  27. select * into v_e from emp where empno=7369;
  28. dbms_output.put_line('员工姓名:'||v_e.ename);
  29. end;
  30. --所以这里不应该写table_name 应该写数据源 视图也可以用,子查询不可以用
  31. (可能是因为视图是数据库对象)
  32. .

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/584747
推荐阅读
相关标签
  

闽ICP备14008679号