第一周主要任务:熟悉命令
Select, distinct, where, AND, OR, OrderBy, insert, update, delete, Top, Like, In, Between, Aliases, Join, Inner Join, Left Join, Right Join, Full Join, Union, Select, Into, Create Table, Constraints, Not, Null, Unique, Default, Create, Index, Drop, Alter, Increment 了解序列的语法,触发器的语法,loop循环体的语法
遇到的问题及解决
1, 误删除了表,想要恢复
create table qj_test2
as
select * from qj_test as of TIMESTAMP to_timestamp('20120711 16','yyyymmdd hh24');
2,commit 的使用
如何解决ORA-00054资源正忙,要求指定NOWAIT /////杀掉进程或者等待执行结束
commit 之前其他账号不能看到你更新的数据
3,SELECT temyear.nextval FROM dual //查询到temyear的下一个数值 每查询一次值修改一次,不同的数据库中也成立可以说是同步的,SELECT temyear.nextval-10 FROM dual 可以进行计算,SELECT temseq.currval FROM dual 不能一开始就用需要初始化一下=====第一次执行的时候要next 初始化一下(oracle规定)
4,了解LOOP循环体的语法
DECLARE COUNT NUMBER:=1; countid NUMBER:=16;
LOOP
COUNT:=COUNT+1; EXIT WHEN COUNT>6;
UPDATE qj_test3 SET birth= temyear.nextval WHERE birth='null';
COMMIT;
END LOOP;
修改:
DECLARE v_COUNT NUMBER:=1; countid NUMBER:=16;
BEGIN
WHILE v_COUNT<=6
LOOP
UPDATE qj_test3 SET birth= temyear.nextval WHERE autoid=countid;
v_COUNT := v_COUNT + 1;
countid := countid + 3;
COMMIT;
END LOOP;
END; // 为什么用exit when 不行!(没有深入往下找原因,没有找到解决办法,下周可以继续进行)
5,触发器的语法
SELECT temseq.nextval INTO :new.autoid FROM dual; //new. 这个很关键!!之前没有将此关键字写入,导致很长时间找错都是无用
SELECT * FROM All_Triggers a WHERE a.table_name='QJ_TEST3';//查询表对应的触发器
也可在my objects 里查看triggers 就可以看到所有的触发器了!
CREATE OR REPLACE TRIGGER trg_test
BEFORE INSERT ON qj_test3
FOR EACH ROW
BEGIN
SELECT temseq.nextval INTO:new.autoid FROM dual;
END trg_test;
写了一个trg_test的触发器,出现以下错误
Error: PLS-00801: 内部错误 [ph2csql_strdef_to_diana:bind] Line: 2Text: FOR EACH ROW
Error: PL/SQL: ORA-06544: PL/SQL: 内部错误, 参数: [ph2csql_strdef_to_diana:bind], [], [], [], [], [], [], [] Line: 4 Text: SELECT temseq.nextval INTO: new.autoid FROM dual;
Error: PL/SQL: SQL Statement ignored Line: 4 Text: SELECT temseq.nextval INTO: new.autoid FROM dual;
主要是语法不对,多了一个空格
6,修改表属性
ALTERTABLE qj_test4DROPCOLUMN address
ALTERTABLE qj_test4ADD qj_size NUMBER(20)
F8提交之后查询不出最新的结果
经过发哥的指点,需要在执行编译之后,再COMMIT提交。
7,AS的语法
在网上查到AS的用法,拿来练手,结果报错解决不了SELECT q.autoid
FROM qj_test3 AS q
WHERE q.autoid ISNOTNULL
=====报错 网上给出的解决办法是 不用AS 直接用 qj_test3
一,SELECT * INTO qj_test7 FROM qj_test6
二,INSERT INTO qj_test7SELECT *FROM qj_test6
经过网上查询SQL一是SQL SERVER的语法,SQL二是ORACLE的语法,返回到上面的问题,可能也是同样的语法差异!在以后的学习中一定要查询清楚oracle与sql语法的异同
下周计划:
开始练习存储过程,多写几个来练手,学会查表空间、查回话,掌握sql优化方法;