当前位置: 首页 > news >正文

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;
/

 

暂时就这些了。

转载于:https://www.cnblogs.com/xushining/p/5001006.html

相关文章:

  • GPU大百科全书索引(有助于理解openGL工作流程)
  • 数据结构实例参考——“查找”的原理
  • git clone Gtk-WARNING **: cannot open display
  • 利用MAVEN打包时,如何包含更多的资源文件
  • js ajax 1
  • Linux git 文档
  • SQL2005SP4补丁安装时错误: -2146233087 MSDTC 无法读取配置信息。。。错误代码1603的解决办法...
  • 如何对DevExpress ASPxGridView进行分组排序?
  • EXECUTORSERVICE线程池讲解
  • iOS-技巧性总结
  • svn安装--linux环境
  • Linux下which、whereis、locate、find命令的区别
  • Java基本数据类型之Number
  • Java实现RSA数字签名算法
  • ASP.NET中字段赋值问题
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • es6--symbol
  • Objective-C 中关联引用的概念
  • Python学习之路13-记分
  • Spring声明式事务管理之一:五大属性分析
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 将回调地狱按在地上摩擦的Promise
  • 小程序测试方案初探
  • 一份游戏开发学习路线
  • 优秀架构师必须掌握的架构思维
  • Linux权限管理(week1_day5)--技术流ken
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (南京观海微电子)——COF介绍
  • (七)c52学习之旅-中断
  • (十)c52学习之旅-定时器实验
  • (四)c52学习之旅-流水LED灯
  • (一)Neo4j下载安装以及初次使用
  • .dwp和.webpart的区别
  • .jks文件(JAVA KeyStore)
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NetCore项目nginx发布
  • .net的socket示例
  • .NET中统一的存储过程调用方法(收藏)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /bin/rm: 参数列表过长"的解决办法
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • []我的函数库
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [BZOJ 3282] Tree 【LCT】
  • [DevOps云实践] 彻底删除AWS云资源
  • [ERROR] Plugin 'InnoDB' init function returned error
  • [IDF]啥?
  • [IE9] IE9 beta版下载链接
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法
  • [J2ME]url请求返回参数非法(java.lang.illegalArgument)