这是我第一次实际工作中适用oracle,之前一直是用sql server,两种sql的语法差别很大,以前在用t-sql的时候经常不写分号结尾,在用pl/sql的时候不写就出问题了。
我觉着我踩的这些坑,第一次用oracle的园友们应该也有不少回踩到,这里贴出这些坑以及常用的一些函数,让大家借鉴一下。
--dual表是oracle的伪表
--直接在查询结果中修改表数据,加上rowid就好了 select rowid,t.* from table t ;
--拼接字符串,用||而不是+ select 'a'||'b' from dual;
--数字转字符串 select to_char(8) from dual;
--字符串转数字 select to_number('8') from dual;
--字符串转日期 select to_date('2015/11/15 16:37:48','yyyy-mm-dd hh24:mi:ss') from dual;
--oracle有包的概念,里面放着一堆的函数跟存储过程,都是可以用包点出来的,跟类差不多,就是个容器。 --如果你创建了包体,执行完毕后,是还需要编译的。
--oracle 里面 := 是 赋值的意思
--如何调试存储过程 --在左边菜单栏打开你的procedures 文件夹,找到要调试的存储过程,右键,选择"测试"(如果这个存储过程有一个红色的叉叉,就表示编译没通过,右键,点“编辑”可以看到报错的地方),就会进入到测试窗口,在最下面有变量列表,在"值"这一列输入存储过程的参数,按"F9"就可以开始调试。在这个测试窗口的左上角,有"单步进入","单步跳过"的按钮,相信你会用的了。
--loop语句,要嵌套在begin end 里面,不然用不了。呵呵
--给变量赋值,并打印 --赋值是没问题的,但是打印要放在begin end 里面,声明不能放到里面。真是呵呵了 --1===》 declare x int := '55'; begin dbms_output.put_line(x); end; --2====》 declare x int ; begin x:= 666; dbms_output.put_line(x); end;
--if else 语句的小demo,不要忘记分号! declare v1 number := 1; v2 number := 2; vr varchar2(20); begin if v1 < v2 then vr := 'yes'; else vr := 'no'; end if; dbms_output.put_line(vr); end;
--各种循环的形式小demo ----------loop exit end ---------------- declare v1 number := 0; BEGIN loop if v1 > 1000 then exit; end if; v1 := v1 + 1; DBMS_OUTPUT.PUT_LINE(V1); end loop; END; ----------loop exit when end---------------- declare v1 number := 0; BEGIN loop exit when v1 > 5; v1 := v1 + 1; dbms_output.put_line(v1); end loop; END; ---------while loop end-------------------------- declare v1 number := 0; begin while v1 <= 100 loop v1 := v1 + 1; dbms_output.put_line(v1); end loop; end; ---------for in loop end--------------- --||为oracle字符串连接符 begin for v_rlt in -3 .. 3 loop dbms_output.put_line('v_rlt = ' || v_rlt); end loop; dbms_output.put_line('FOR循环已经结束!'); end;
--使用游标注意点: --使用游标插入数据时,如果报错了,只能把sql抓出来运行才看得到异常信息,在游标里面什么错误都不会报,直接就运行完了,呵呵。
同义词: 相当于alias(别名),比如把user1.table1在user2中建一个同义词table1 create synonym table1 for user1.table1; 这样当你在user2中查select * from table1时就相当于查select * from user1.table1; 优点自己总结吧。 例如: 在oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必须得有权限,但是如果是别人将权限授予了我们,我们也是能对数据库进行操作的,但是我们必须要已授权的表的名称前键入该表所有者的名称,所以这就是比较麻烦的,遇到这种情况,我们该怎么办呢?创建个同义词吧!这样我们就可以直接使用同义词来使用表了。
database links
在pl/sql左侧菜单栏,有database links文件夹 建立dblink,可以直接在当前账户下访问另一个数据库的表
如何修改存储过程:
在oracle中不需要用alter关键字来修改原存储过程,直接把 create or replace procedure ... 再执行一次就可以完成修改
oracle调试注意点:
如上图,字符串的,那个29,千万不要手贱去加个单引号,真是蛋都碎了。
如何打印异常信息,比如说插入信息时导致的触发器报错,有时候是看不到的
DECLARE --声明异常 v_ErrorCode NUMBER; -- Variable to hold the error message code v_ErrorText VARCHAR2(200); BEGIN insert into aa(name,py_fname,)values('韩信','h'); EXCEPTION WHEN OTHERS THEN v_ErrorCode := SQLCODE; v_ErrorText := SUBSTR(SQLERRM, 1, 200); -- Note the use of SUBSTR here. dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText); END;
调用输入输出参数的存储过程
declare p_outval VARCHAR2(100); begin HelloWorld2('FP0001',p_outval); dbms_output.put_line('p_outval=' || p_outval); end;
--获取第一条数据 select * from tab_name where rownum = 1 --获取日期最大的一条数据 select * from (select t.regtime, t.nechen,t.id from tablename t order by regtime desc) where rownum=1
刷数据
begin for i in (select .* from A ) loop update B t set department = 'ET04' where t.id = i.id; commit; end loop; end;
新建一个JOB,每分钟往表插入一条数据
-- Create table create table aaa ( aaa DATE ); --Creat Proc create or replace procedure MYPROCss is TT VARCHAR2(20); begin TT := '2154'; insert into aaa values(sysdate); commit; end MYPROCss; --Creat Job declare x number; begin sys.dbms_job.submit(job => x, what => 'MYPROCss;',--存储过程名称 next_date => to_date('28-10-2016 10:17:59', 'dd-mm-yyyy hh24:mi:ss'), interval => 'sysdate+1/1440'); commit; end; /
暂时就这些了。