• Oracle坑爹入门踩坑篇


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

    暂时就这些了。

  • 相关阅读:
    git操作工作流
    http请求发生了两次(options请求)
    npm dose not support Node.js v10.15.3
    数据双向绑定页面无反应(angularjs)
    table样式的下拉框(angularjs)
    vue-router做路由拦截时陷入死循环
    js前台调用lodop打印
    vuejs2.0的生命周期解读
    Promise的一些相关讲解
    JAVA net 笔记
  • 原文地址:https://www.cnblogs.com/xushining/p/5001006.html
Copyright © 2020-2023  润新知