Oracle备忘录1

作者:网络    软件教程库   2020-05-21

数据库管理员:安装升级oracle数据库建库,表空间,表,视图,索引。。。制定并实施备份和修复计划数据库权限管理,调优,故障排除对于高级dba,要求参与项目开发,会编写sql语句,存储过程,触发器,规则,约束,包create table emp(empno number(4) primary key,ename varchar2(10),job varchar2(9),mgr number(4),hiredate date,sal number(7,2),comm number(7,2),deptno number(4));create table dept(deptno number(4),dname varchar2(14),loc varchar2(13));create table salgrade(grade number,losal number,hisal number );create table bonus(ename varchar(10),job varchar2(9),sal number,comm number);insert into dept values (10,‘accounting‘,‘new york‘);insert into dept values (20,‘research‘,‘dallas‘);insert into dept values (30,‘sales‘,‘chicago‘);insert into dept values (40,‘operations‘,‘boston‘);insert into emp values(7369,‘smith‘,‘clerk‘,7902,to_date(‘17-12-1980‘,‘dd-mm-yyyy‘),800,null,20); insert into emp values(7499,‘allen‘,‘salesman‘,7698,to_date(‘20-2-1981‘,‘dd-mm-yyyy‘),1600,300,30);insert into emp values(7521,‘ward‘,‘salesman‘,7698,to_date(‘22-2-1981‘,‘dd-mm-yyyy‘),1250,500,30);insert into emp values(7566,‘jones‘,‘manager‘,7839,to_date(‘2-4-1981‘,‘dd-mm-yyyy‘),2975,null,20);insert into emp values(7654,‘martin‘,‘salesman‘,7698,to_date(‘28-9-1981‘,‘dd-mm-yyyy‘),1250,1400,30);insert into emp values(7698,‘blake‘,‘manager‘,7839,to_date(‘1-5-1981‘,‘dd-mm-yyyy‘),2850,null,30);insert into emp values(7782,‘clark‘,‘manager‘,7839,to_date(‘9-6-1981‘,‘dd-mm-yyyy‘),2450,null,10);insert into emp values(7839,‘king‘,‘president‘,null,to_date(‘17-11-1981‘,‘dd-mm-yyyy‘),5000,null,10);insert into empvalues(7788,‘scott‘,‘analyst‘,7566,‘19-4月-1987‘,3000.00,null,20);insert into emp values(7844,‘turner‘,‘salesman‘,7698,to_date(‘8-9-1981‘,‘dd-mm-yyyy‘),1500,0,30);insert into emp values(7900,‘james‘,‘clerk‘,7698,to_date(‘3-12-1981‘,‘dd-mm-yyyy‘),950,null,30);insert into emp values(7902,‘ford‘,‘analyst‘,7566,to_date(‘3-12-1981‘,‘dd-mm-yyyy‘),3000,null,20);insert into emp values(7934,‘miller‘,‘clerk‘,7782,to_date(‘23-1-1982‘,‘dd-mm-yyyy‘),1300,null,10);insert into salgrade values (1,700,1200);insert into salgrade values (2,1201,1400);insert into salgrade values (3,1401,2000);insert into salgrade values (4,2001,3000);insert into salgrade values (5,3001,9999);select * from dept;select * from emp;select * from salgrade;create user db_user identified by db_user_pw; ——创建数据库/用户,要在system下进行操作drop user db_user (cascade);passw; ——修改用户密码 passw db_user; ——管理员修改用户密码alter user db_user identified by db_user_pw; ——管理员修改用户密码shutdown;startup;show parameter;赋予权限:前两个要在system下进行操作方法1:grant dba to db_user; ——赋予用户数据库管理权限方法2:grant connect to db_user; ——赋予用户连接权限 grant resource to db_user; ——赋予用户资源权限方法3:connect db_user/db_user_pw as sysdba或者as sysoper; ——连接数据库并赋予权限grant create session to db_user; ——赋予用户创建会话的权限,对oracle数据库暂时不知道怎么用create user role not identified; ——创建角色时不需要输入密码即可登录 显示数据库中所有的用户:select user name from dba_user s;显示数据库中用户的系统权限:select * from dba_sys_privs where grantee=‘角色名;select * from role_sys_privs where role=‘角色名;显示数据库中用户的对象权限:select * from dba_tab_privs where grantee=‘角色名‘; 显示数据库中用户的角色:select * from dba_role_privs where grantee=‘用户名‘;显示数据库中用户的权限select * from dba_sys_privs oracle究竟有多少中角色select * from dba_roles;oracle的所有系统权限select * from system_privilege_map order by name;oracle的所有对象权限select distinct privilege from dba_tab_privs;显示当前数据库的全称:select * from global_name;conn sys/change_on_install as sysdba;——作为系统数据库管理员登录drop table r; ——删除表rename r to r1; ——重命名表名alter table r rename column a1 to a2; ——修改表中的列名alter table r add a d; ——增加列的属性alter table r modify a d; ——修改列的属性alter table r drop a; ——删除列的属性insert into r values(); ——插入元组(表中内容)update table r set a where ...; ——更新元组(表中内容)delete from r where ...; ——删除元组(表中内容),写日志,可恢复truncate table r;__删除元组(表中内容),速度快,不写日志,不可恢复show linesize; ——显示行的宽度,默认#20540;为80set linesize number; ——设置行的宽度为number set pagesize number; ——设置每页显示的行数,默认#20540;为14alter session set nls_date_format=‘yyyy-mm-dd‘; __日期设置成中国人习惯的方式nvl(d,0) ——如何处理空#20540;null--增加约束alter table r modify a not null;--非空alter table r add constraint cardunique unique(a); --身份证唯一alter table r add constraint addresscheck check(a in(‘北京‘,‘上海‘,‘广州‘));--删除约束alter table r drop constraint a unique/check;alter table r drop constraint primary key cascade;update r set a where ...; ——更新元组(表中内容)update r set (a1,a2,a3)=(select (a1,a2,a3) from r where...) where...;delete from r where ...; ——删除元组(表中内容)显示当前用户下的所有表:select table_name from user _tables;显示当前用户可以访问的所有的表:select table_name from all_tables;显示数据库中全部的表,必须是dba或者具有select any table的权限select table_name from dba_tables;create profile failed_login_lock_name limit failed_login_attemps num1 password_lock_time num2; ——建立输入密码错误次数达到num1时锁定规定时间num2create profile password_life_time_name limit password_life_time num1 password_grace_time num2 password_reuse_time number3; ——建立在num1修改密码,宽限天为num2,在number3天后可以重用drop profile profile_name(cascade); ——删除文件alter user db_user profile profile_name; ——对某用户实行这一锁定规则 alter user db_user account unclok; ——进行解锁 savapoint a;——设置回滚点,保存点,可预防数据库重要信息的丢失,保存点个数没有限制(可以设置多个回滚点)rollback to a;——回滚到这个点rollback;——回滚到最初的状态commit;——提交,每天都必须的操作,但是会删除全部保存点,释放锁,谨慎使用,使用时确保数据库已经不存在问题!分页:rownum经典例句:select * from (select a.*,rownum rn from (select * from emp) a where rownum=10) where rn=6;复制一部分:create table mytable(id,name) as select empno,ename from emp;union 合并查询去重 union all 不去重intersect 交集查询minus 差集查询,前面减去两者的交集to_date(‘1991-12-12‘,‘yyyy-mm-dd‘) to_date(‘1991/12/12‘,‘yyyy/mm/dd‘) ——指定日期#26684;式insert into emp values(1235,‘test_2‘,‘manager‘,7782,to_date(‘1998-9-9 12:10:10‘,‘yyyy-mm-dd hh24:mi:ss‘),1000,100,10);insert into emp values(1236,‘test_3‘,‘manager‘,7782,sysdate,1000,100,10);select ename,to_char(hiredate,‘yyyy-mm-dd hh24:mi:ss‘) from emp; ——查询具体时间,小时,分钟,秒,bbs系统常备select ename,to_char(hiredate,‘yyyy-mm-dd hh24:mi:ss‘),to_char(sal,‘l99,999.99‘) from emp; ——显示本地货币select * from emp where to_char(hiredate,‘yyyy‘)=1980; ——显示某一年入职的员工,某一月mm,某一年中的某一月同理yyyy-mmset translate read only; ——事务处理集函数:lower(a);upper(a);length(a);substr(a,m,n); ——m代表起始位置,n代表取得字符个数完成首字母大写 ——select upper(substr(a,1,1)) from emp;完成后面字母小写——select lower(substr(a,2,length(a)-1)) from r;合并:select upper(substr(a,1,1))||lower(substr(a,2,length(a)-1)) from r;replace(a,search_string,replace_string); ——替换字符instr(char1,char2,[,n[,m]]; ——取字串在字符串的位置数学函数:round(a,m); ——四舍五入,保留m位trunc(a,m);——截取数字,保留m位,忽略余数mod(a,n);——对a取模nfloor(a);——返回小于或者等于n的最大整数,忽略余数ceil(a);——返回大于或者等于n的最小整数select sysdate from dual;——返回系统时间select * from emp where sysdateadd_months(hiredate,8);返回系统时间8个月之前的员工select trunc(sysdate-hiredate) 入职天数 from emp; ——返回入职天数select hiredate,ename from emp where last_day(hiredate)-2=hiredate; ——返回每月倒数第2天的员工转换函数:to_char(a,‘‘);to_date(a,‘‘);系统函数:select sys_context(‘user env‘,‘db_name‘) from dual; ——language:当前语言,session_user :当前用户,current_schema:当前方案进行行迁移:insert into r2(a1,a2,a3) select a1,a2,a3 from r1 where ...;导出:导出表,导出方案,导出数据库exp命令,要从命令行进入oracle中的bin 目录user id,tables,owner,full=y,inctype,rows,file导出表的结构而不导入数据:exp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp rows=n导出表:exp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp下面这种方式导出快exp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp direct=y导出方案:exp user id=learning/[email#160;protected] owner=learning file=e:\desktop\emp.dmp导出全部:exp user id=system/[email#160;protected] full=y inctype=complete file=e:\desktop\emp.dmp导入表的结构,而不导入表的数据:imp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp rows=n导入表:imp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp导入数据,如果表已经存在只导入数据:imp user id=learning/[email#160;protected] tables=(emp) file=e:\desktop\emp.dmp ignore y导入表到其他用户imp user id=system/[email#160;protected] table=emp file=e:\desktop\emp.dmp touser =learning;导入数据库:imp user id=system/[email#160;protected] full=y file=e:\desktop\emp.dmp touser =learning;建立表空间:create tablespace data01 datafile ‘e:\data01.dbf‘ size 20m uniform size 128k;增加数据文件:alter tablespace data01 add datafile ‘e:\data02.dbf‘ size 20m;增加数据文件的大小:alter tablespace data01 ‘e:\data01.dbf‘ resize 20m;设置文件的自动增长:alter tablespace data01 ‘e:\data01.dbf‘ autoextend on next 10m maxsize 500m;磁盘损坏时的做法:确定数据文件所在的表空间:select tablespace_name from dba_data_files where file_name=‘e:\data01.dbf‘; 使表空间脱机:alter tablespace data01 offline;移动表空间:host move e:\data01.dbf d:\data01.dbf对数据库文件进行逻辑修改:alter tablespace data01 rename datafile ‘e:\data01.dbf to d:\data01.dbf‘;使得表空间联机:alter tablespace data01 online;使用数据库表空间:create table r(deptno number(4),dname varchar2(14),loc varchar2(13)) tablespace data01;查询表空间中的表: select * from all_tables where tablespace_name=‘data01‘;//注意大写查询表处于哪个表空间:select tablespace_name,table_name from user _tables where table_name=‘emp‘; //注意大写删除表空间:drop tablespace data01 including contents and datafiles;表级定义:在定义了列之后添加约束列级定义:在定义列的同时添加约束创建一个存储过程,该过程可以向某表中添加记录create table mytest(name varchar2(30),password varchar2(30));create or replace procedure b isbegin--执行部分insert into mytest values(‘jack‘,‘123456‘);end;/create or replace procedure b isbegin--执行部分delete from mytest where name=‘jack‘;end;/replace表示如果有相同的过程名就替换,b表示过程名查看错误信息:show error;如何调用该过程1:exec 过程名(参数#20540;1,参数#20540;2);2:call 过程名(参数#20540;1,参数#20540;2);定义常量时,建议用v_作为前缀v_sal定义常量时,建议用c_作为前缀c_rate当定义游标时,建议用_cursor作为后缀emp_cursor当定义例外时,建议用e_作为前缀e_errorset serveroutput on;--开启显示内容set serveroutput off--关闭显示内容begindbms_output.put_line(‘helloworld‘);end; /--这个最后在加上--显示雇员名,薪水declarev_ename varchar2(5);v_sal number(7,2);begin select ename,sal into v_ename,v_sal from emp where empno=no;--输出dbms_output.put_line(‘雇员是:‘||v_ename||‘,他的薪水是:‘||v_sal);--异常处理exceptionwhen no_data_found thendbms_output.put_line(‘输入有误,请重新输入!‘);end;/案例create procedure a1(a1name varchar2,a1sal number) isbegin--执行,根据故原名修改工资update emp set sal=a1sal where ename=a1name; end;/exec a1(‘scott‘,150);--这样scott的工资就被修改成了150--采用function来查询某个雇员的工资create function fj_fun1(fjname varchar2) return number is yearsal number(7,2);begin--执行部分select sal*12#43;nvl(comm,0)*12 into yearsal from emp where ename=fjname;return yearsal;end;/--调用var abc number;call fj_fun1(‘scott‘) into:abc;--创建包。声明该包有一个过程update_sal,声明该包有一个函数annual_income:create package fj_package isprocedure update_sal(name varchar2,newsal number);function annual_income(name varchar2) return number;end;/--给包sp_package实现包体 ,来修改某个雇员的工资或者查询某个雇员的工资create or replace package body fj_package is procedure update_sal(name varchar2, newsal number) is begin update emp set sal = newsal where ename = name; end; function annual_income(name varchar2) return number is annual_salary number; begin select sal * 12 #43; nvl(comm, 0) into annual_salary from emp where ename = name; return annual_salary; end; end; / --调用call fj_package.update_sal(‘scott‘, 1400);--输入员工号,显示雇员姓名、工资、个人所得税,税率为0.03为例declare c_tax_rate number(3,2):=0.03;v_name varchar2(5);--emp.ename%typev_sal number(7,2);--emp.sal%typev_tax_sal number(7,2);begin--执行select ename,sal into v_name,v_sal from emp where empno=no;--计算个人所得税v_tax_sal:=v_sal*c_tax_rate;--注意冒号--输出dbms_output.put_line(‘雇员是:‘||v_name||‘,工资是:‘||v_sal||‘,需要交的个人所得税是:‘||v_tax_sal);end;/--类#20284;于高级语言中的结构体--pl/sql记录实例declare --表示要定义一个pl/sql记录类型 emp_record_type,类型包含name,salary,titletype emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);--定义了一个变量,这个变量的类型是emp_record_typefj_record emp_record_type;--v_name varchar2(45);beginselect ename,sal,job into fj_record from emp where empno=7788;dbms_output.put_line(‘员工名:‘||fj_record.name||‘,工资是:‘||fj_record.salary);end;/--相当于高级语言中的数组declare--定义了一个pl/slql表类型,该类型是用于存放emp.ename%typetype fj_table_type is table of emp.ename%typeindex by binary_integer;--代表下标是按整数排序的,可以为负数fj_table fj_table_type;begin select ename into fj_table(0) from emp where empno=7788;dbms_output.put_line(‘员工名:‘||fj_table(0));--下标跟上面的下标一样end;/declare--定义了一个pl/slql表类型,该类型是用于存放emp.ename%typetype fj_table_type is table of emp.ename%typeindex by binary_integer;--代表下标是按整数排序的,可以为负数fj_table fj_table_type;begin select ename into fj_table(0) from emp;dbms_output.put_line(‘员工名:‘||fj_table(0));--下标跟上面的下标一样end;/--输入部门号,显示该部门所有员工姓名和他的工资declare --定义游标类型fj_emp_cursortype fj_emp_cursor is ref cursor;--定义游标变量test_cursor fj_emp_cursor;--定义变量v_ename emp.ename%type;v_sal emp.sal%type;begin--执行--把test_cursor和一个select结合open test_cursor for select ename,sal from emp where deptno=no;--循环取出loopfetch test_cursor into v_ename,v_sal;--判断是否test_cursor是否为空exit when test_cursor%notfound;dbms_output.put_line(‘雇员名是:‘||v_ename||‘,薪水‘||v_sal);end loop;end;/--在上面的基础上,如果某个雇员的工资低于200元,就增加100元declare --定义游标类型fj_emp_cursortype fj_emp_cursor is ref cursor;--定义游标变量test_cursor fj_emp_cursor;--定义变量v_ename emp.ename%type;v_sal emp.sal%type;begin--执行--把test_cursor和一个select结合open test_cursor for select ename,sal from emp where deptno=no;--循环取出loopfetch test_cursor into v_ename,v_sal;--判断工资高低,决定是否更新--判断是否test_cursor是否为空exit when test_cursor%notfound;dbms_output.put_line(‘雇员名是:‘||v_ename||‘,薪水‘||v_sal);end loop;end;/--编写一个过程,输入雇员名,工资低于2000的雇员工资增加10%create or replace procedure fj_pro6(fjname varchar2) is--定义v_sal emp.sal%type;begin--执行select sal into v_sal from emp where ename=fjname;--判断if v_sal2000 thenupdate emp set sal=sal*1.1 where ename=fjname;end if;end;/--调用exec fj_pro6(‘scott‘);--雇员如果补助为零则加200,如果不为零则加100create or replace procedure fj_pro7(fjname varchar2) is--定义v_comm emp.comm%type;begin--执行select comm into v_comm from emp where ename=fjname;--判断if v_comm0 thenupdate emp set comm=comm#43;100 where ename=fjname;else update emp set comm=comm#43;200 where ename=fjname;end if;end;/--调用exec fj_pro7(‘scott‘);--三个条件分支 if-then-elseif-else--输入雇员编号,如果该雇员的职位是president就给他的工资增加1000,如果该雇员的职位是manager就给他的工资增加500,其它职位的雇员工资增加200。 create or replace procedure fj_pro8(fjno number) is--定义v_job emp.job%type;begin--执行select job into v_job from emp where empno=fjno;if v_job=‘president‘ thenupdate emp set sal=sal#43;1000 where empno=fjno;elsif v_job=‘manager‘ thenupdate emp set sal=sal#43;500 where empno=fjno;elseupdate emp set sal=sal#43;200 where empno=fjno;end if;end;/--调用exec fj_pro8(7839);--循环语句 loop--users表中,用户编号从1开始增加create table users(userno number,username varchar2(40));create or replace procedure fj_pro9(fjname varchar2) is--定义:=表示赋#20540;v_num number:=1;beginloopinsert into users values(v_num,fjname);--判断退出条件exit when v_num=10;--自增v_num:=v_num#43;1;end loop;end;/--调用exec fj_pro9(‘root1‘);--这样表中会有十个username为root1的元组create or replace procedure fj_pro10(fjname varchar2) is--定义:=表示赋#20540;v_num number:=11;beginwhile v_num=20 loopinsert into users values(v_num,fjname);v_num:=v_num#43;1;end loop;end;/--调用exec fj_pro10(‘root1‘);

oracle备忘录1

原文地址:http://blog.csdn.net/qq_21682823/article/details/45422341

软件教程库 原文链接:https://www.itjcku.com/9999/1091533.html

阅读全部内容


Tags:备忘录

返回首页



推荐内容

FileStream文件流

使用文件流拷贝一个较大的多媒体文件: public static void copyfile(string soucr ...

C语言BFS(5)___TT与魔法师(swustoj2464)

description tt生活在一个充满魔法的国度,为了便于管理,国王请魔法师在一些重要的城市之间造出 ...

进程类Process与多线程Thread

进程类(process)的基本操作: //通过进程类查询系统所有进程 process[] pr ...

Xml解析方式之Pull解析器的使用

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析xml文件,接下来我会说明使用pull解析器来读取xml文件 ...

enum,EnumMap,EnumSet

enum基本使用 : package com.enumtest; enum shrubbery { gr ...

Hibernate乱码问题解决

乱码问题其实归根接地就是两端的字符集不统一。 解决思路也有两种: 1. 修改两端字符集统一。 2. 通过代码进行转 ...

eclipse集成struts2.3.20

需要强调的是,这里介绍的是在eclipse工具下集成struts2.3.20而不是myeclipse添加对struts2 ...

ubi文件系统制作,还是"-c"选项的问题

以下是分析记录: --------------------------------------------------- ...

如何把事情做到最好读书笔记1

开篇语: 每个人生来都具备足够的潜力,每个人都能做到别人#30524;中难以企及的事情。请永远保持初学之心,勇敢面对 ...

如何把事情做到最好读书笔记2

第二章 认清自己:你属于哪种类型的人 你必须足够了解你自己,下面有三种类型的人、 (1)浅尝辄止者 浅尝辄止者对一切 ...

如何把事情做到最好读书笔记3

第三章 一份耕耘才能一份收获 当你决定踏上精益求精之路时,你会突然发现周围的一切都与你所追求的#26684;#2668 ...

如何把事情做到最好读书笔记4

第四章 热爱平台期 从小,我们接受的教育就是好好学习,这样才能上好的大学,上好的大学才能找到好工作,有好工作才能有钱买 ...

习题10-21二项式系数UVa1649

1.题目描述:点击打开链接 2.解题思路:本题利用枚举#43;二分解决。问题的关键是选对枚举对象,因为要找c(n,k)= ...

mysql小技巧

selectnow(),user(),version(),database(); #最后输入\c是放弃的意思 des ...

Java学习笔记——面试常客:写出一个死锁的例子

现在的面试挺蛋疼,为了考察大家的语言掌握水平,类#20284;这样的题特别多,不过在某个角度来说确实能看出一个人对某个知 ...

UVA-10396VampireNumbers暴力+打表

题目大意:给出n,要求你输出所有符合规则的n位数 规则如下,这个n位数由两个n/2位数相乘得到,并且满足 1.这n位 ...

CF148D.Bagofmice[概率dp]

题目链接:http://codeforces.com/problemset/problem/148/d 题目大意:一袋子 ...

HDU-1846-BraveGame(巴什博弈)

题目传送:brave game 介绍: 巴什博奕(bash game): 首先我们来玩一个比较古老的报数游戏。a ...

HDU-2149-PublicSale(巴什博弈)

题目传送:public sale 思路:巴什博弈 ac代码: #include lt;cstdiogt; # ...

enum实现售卖机

首先 推荐一下google的代码风格 :https://google-styleguide.googlecode ...

批量添加用户

a、创建用户文件,因为添加的用户比较多,因此编写脚本创建一个用户文件user.txt #!/bin/ba ...

解决侧滑中ViewPager和SlidingMenu的滑动冲突

当我们在使用开源框架slidingmenu时,如果要是使用到viewpager,就会出现滑动冲突。 解决方案: }/** ...

shell打乱文件行

思路,产生一个随机数组,然后按按照数组的元素将文件中行的重新输出 1、随机数组的生成 看书的时候感觉很是简单。第 ...

编程之美2015初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256mb 描述 一副不含王的扑 ...

Java设计模式之单例模式(恶汉式和懒汉式)

/* * 单例模式: * 饿汉式:类一加载就创建对象 * 懒汉式:用的时候,才去创建对象 * 面试题:单例模式的 ...

Html简单介绍

1、html--- hypertext markup language 的缩写 --- 超文本 标记 语言. 这个技 ...

configure:error:youmustconfigureinaseparatebuilddirectory

configure glibc-2.14 时出现以下错误: [[email#160;protected] opt]# ...

kohana框架生成feed

创建feed feed::create()斱法用给定癿参数杢创建 rss戒者 atom feed。下面是可接叐癿参数。 ...

用USB安装linux

手边没有光驱,安装ubuntu可以用 linuxlive usb creator 2.9.3,在百度网盘里有的。http ...

一个复杂子查询SQL优化

select * from test.vmark vk where id in (select v.id ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com