触发器
先建立一个表: create table emp2_log values(uname varchar2(20),action varchar2(10),atime date); 如果往这个表中插入,删除,更改就会触发 create or replace trigger tri after insert or delete or update on emp2 for each row begin if inserting then insert into emp2_log values(user,'insert',sysdate); elsif updating then insert into emp2_log values(user,'update',sysdate); elsif deleting then insert int
游标的部分说明
使用游标将emp表中的ename全取出来: declare cursor c is select * from emp; v_emp c%rowtype; begin open c; loop --由于是一条一条fetch,所以使用do-while循环 fetch c into v_emp; exit when(c%notfound);--这里是结束循环的条件 dbms_output.put_line(v_emp.ename); end loop; close c; end; / declare cursor c is select * from emp; v_emp c%rowtype; begin open
PL/SQL中的几点注意
PL/SQL中的几点注意: 如果在PL/SQL中有select语句必须返回一条且仅有一条记录。 Select 语句里必须有一个Into: declare v_ename emp.ename%type; v_sal emp.sal%type; begin select ename,sal into v_ename,v_sal from emp where empno = 7369; … … declare v_emp emp%rowtype; begin select * into v_emp from emp where empno = 7369; dbms_output.put_line(v_emp.ename); end; 显示sql语句影响多少行记录
PL/SQL中的复合变量
PL/SQL中的数组就是TABLE变量类型: 声明方法: declare type type_table_emp_empno is table of emp.empno%type index by binary_integer; v_empnos type_table_emp_empno; begin v_empnos(0) := 1234; v_empnos(1) := 2345; v_empnos(-1) := 4321; dbms_output.pub_line(v_empnos(-1)); end ; PL/SQL中的Record变量相当于JAVA中的类 declare type type_record_dept is record ( Deptno
truncate,delete,drop的异同点(转)
注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态. 2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中
表级约束
表级约束两个字段组合必须唯一 Create table test (name varchar2(10),age number(2),constraint abc_name_age_un1 unique(name,age)); 建好后连续插入两次: Insert into test values(‘a’,1); 就会出现ORA-00001: unique constraint (XLQ.ABC_NAME_AGE_UN1) violated这样的警告。 如果再这样插入: Insert into test values(‘a’,2); 就是可以的,因为只有插入时两个字段组合相同的时候才会报错。[@more@]
求薪水最高的第6到第10个人
求薪水最高的第6到第10个人 Select ename,sal,r from (select ename,sal,rownum r from (select ename,sal from emp order by sal desc)) where r >= 6 and r <= 10;(或者 between and)[@more@]
rownum的一些说明
rownum是结果出来再添加上去的。只能使用 < 号或 <= 号,不能用别的不等符号,都会返回 no rows selected[@more@]
关于ORA-00937: not a single-group group function
关于ORA-00937: not a single-group group function: 一个简单的SQL语句 Select ename,max(sal) from emp;会出现上面的ORA-00937问题 分析后得出结论: 由于max是组函数,就是有多个输入一个输出,但上面这条SQL语句中,如果有多个人的工资都是5000(最大),那么就会有多个输出就会产生错误。 解决办法:使用子查询: Select ename,sal from emp where sal = (select max(sal) from emp); [@more@]
两个有关ASCII码的函数
两个有关ASCII码的函数: 1. selec ascii(‘a’) from dual;(显示出小写a对应的ASCII码) 2. select chr(‘97’) from dual; (显示出ASCII码为97对应的字母)[@more@]
新建一个用户后表空间无法使用ORA-01950: no privileges on tablespace 'TEST_TAB1'
创建用户myuser SQL>create user myuser identitied by password; SQL>grant create session,resource,connect to myuser; SQL>conn myuser/password; SQL>create table TT(id number,name nvarchar2(20)); 出错:ORA-01950:no privileges on tablespace 'USERS' 问题:没有分配表空间配额:配额(quota):允许被使用的空间。用户可以在表空间上可以使用的空间。 SQL>conn sys/password as sysdba; SQL>alter user myuser quota 10M[unlimited] on users;这个问题如果在授予权限时授予reource角色就不会出现。[@m