一、SQL
------------------------1.统计函数 自动去空 ------------------------3.group by,having select deptno,avg(sal),job from scott.emp group by deptno,job; select deptno,max(sal) msal from scott.emp group by deptno having max(sal)>=3000 order by msal desc; ---error -------------查询平均薪水最大的部门薪水
------------------------4.数值转换 --(1)floor
FLOOR returns the largest integer equal to or less than n. SQL> select max(avg(sal)) msal,floor(max(avg(sal))) fsal from scott.emp group by deptno;
--(2)ceil CEIL ( n ) CEIL returns the smallest integer that is greater than or equal to n. SQL> select max(avg(sal)) msal,ceil(max(avg(sal))) csal from scott.emp group by deptno; --(3)round
ROUND returns n rounded to integer places to the right of the decimal point. If you
ROUND is implemented using the following rules: 1. If n is 0, then ROUND always returns 0 regardless of integer. SQL> select max(avg(sal)) msal,round(max(avg(sal)),2) csal from scott.emp group by deptno; |
二、PL/SQL
-----user is u01
---------1.create select * from u01.k1; |
---------4.声明变量及赋值
SQL> declare |
---------5.字符串拼接
SQL> declare SQL> ed -----------------PL/SQL编辑 |
---------6.%type
注%type要求的列必须存在在已创建的表中,未创建的表不可以使用%type
SQL> declare |
---------7.%rowtype
SQL> create table dept as select * from scott.dept where 1=0;
-------------------------同样’type type_dept is table of‘可以转化为record形式显示 SQL> declare
|
---------7.动态变量
SQL> variable x number;
|
---------8.if else end if
create or replace procedure u01.pl(a int) is if a > 10 then end if; end; -----------command create or replace procedure u01.pl(a int) is if a > 10 then end if; end; ----------------------------------------------------- create or replace procedure u01.p2 is end; |
---------9.case
create or replace procedure p3 is case end; |
-------------10.for loop
SQL> begin 1 -------------------------------游标 SQL> declare |
11.动态参数&参数名及异常处理
-------------------1.动态参数&参数名及 no_data_found then异常处理 SQL> declare NO DATA! -------------------------------------------------------- -------------------2.case_not_found异常处理 create or replace procedure u01.p100(a1 int) is SQL> exec p100(7369);
SQL> exec p100(7788); SQL> exec p100(100); --------------------------------------------------------- -------------------3.invalid_cursor异常处理 SQL> declare ---------------------------------------------------------- -------------------4.too_many_rows 异常处理 SQL> declare ------------------------------------------- -------------------5.zero_divide异常处理 SQL> declare
Divider is zero -----------------------------------自定义异常------------------------- -------------------6.自定义异常 create or replace procedure u01.p11(c1 int) is update emp set sal = sal + 1000 where empno = c1; SQL> exec p11(1);
|
12.package
内置程序包
STANDARD 和 DBMS_STANDARD:定义和扩展 PL/SQL 语言环境
DBMS_LOB:提供对 Oracle LOB 数据类型进行操作的功能
DBMS_LOCK:用户定义的锁
DBMS_OUTPUT:处理 PL/SQL 块和子程序输出调试信息
DBMS_SESSION:提供 ALTER SESSION 命令的 PL/SQL 等效功能
DBMS_ROWID:获得 ROWID 的详细信息
DBMS_RANDOM:提供随机数生成器
DBMS_SQL:允许用户使用动态 SQL,构造和执行任意 DML 或 DDL 语句
DBMS_JOB:提交和管理在数据库中执行的定时任务
DBMS_XMLDOM:用 DOM 模型读写 XML 类型的数据
DBMS_XMLPARSER:XML 解析,处理 XML 文档内容和结构
DBMS_XMLGEN:将 SQL 查询结果转换为规范的 XML 格式
DBMS_XMLQUERY:提供将数据转换为 XML 类型的功能
DBMS_XSLPROCESSOR:提供 XSLT 功能,转换 XML 文档
UTL_FILE:用 PL/SQL 程序来读写操作系统文本文件
-------------------建包描述 SQL> create or replace package p101 is ------------------查看包状态 select * from user_objects where object_type like 'PACKAGE%'; -------------------建包体 SQL> create or replace package body p101 is ------------------------ select * from user_objects where object_type like 'PACKAGE%'; -------------------------在PL/SQL sql窗口调用 declare v_cur P101.c1; P101.P01(0, v_cur); loop end loop; --------------------------输出 7369 SMITH -------------------------在PL/SQL command窗口调用 Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 -------------------------应在SQLPLUS 下调用 SQL> variable ; SQL> set linesize 100; PL/SQL procedure successfully completed. SQL> print cur; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 14 rows selected. SQL> variable |
13.函数
函数的主要特性是它必须返回一个值。创建函数时通过 RETURN 子句指定函数返回值的数据类型。
函数的一些限制:
● 函数只能带有 IN 参数,不能带有 IN OUT 或 OUT 参数。
● 形式参数必须只使用数据库类型,不能使用 PL/SQL 类型。
● 函数的返回类型必须是数据库类型。
CREATE OR REPLACE FUNCTION item_price_rage (price NUMBER)
/* 参数、指定返回类型 */
RETURN varchar2
AS
/* 定义局部变量 */
min_price NUMBER;
max_price NUMBER;
BEGIN
SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price
FROM itemfile;
IF price >&#61; min_price AND price <&#61; max_price THEN
RETURN &#39;输入的单价介于最低价与最高价之间&#39;;
ELSE
RETURN &#39;超出范围&#39;;
END IF;
END;
● 匿名块执行函数
DECLARE
p NUMBER :&#61; 300;
MSG varchar2(200);
BEGIN
MSG :&#61; item_price_range(p);
DBMS_OUTPUT.PUT_LINE(MSG);
END;
● SELECT查询调用&#xff08;因为函数必须有返回值&#xff09;
SELECT myfunction FROM dual;
14.存储过程与函数的异同
过程&#xff1a;
作为 PL/SQL 语句执行&#xff1b;
在规范中不包含 RETURN 子句&#xff1b;
不返回任何值&#xff08;只有输入/输出参数&#xff0c;结果集&#xff09;&#xff1b;
可以包含 RETURN 语句&#xff0c;但是与函数不同&#xff0c;它不能用于返回值。
函数&#xff1a;
作为表达式的一部分调用&#xff1b;
必须在规范中包含 RETURN 子句&#xff1b;
必须返回单个值&#xff1b;
必须包含至少一条 RETURN 语句。