这是我第一次实际工作中适用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;
/

 

暂时就这些了。

posted on 2015-11-27 16:16  小小乌龟把头藏  阅读(712)  评论(0编辑  收藏  举报