oracle课程总结报告(在Oracle下如何创建databaselink全面总结)

2025-10-16 04:45:01 :0

oracle课程总结报告(在Oracle下如何创建databaselink全面总结)

各位老铁们好,相信很多人对oracle课程总结报告都不是特别的了解,因此呢,今天就来为大家分享下关于oracle课程总结报告以及在Oracle下如何创建databaselink全面总结的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

在Oracle下如何创建databaselink全面总结


物理上存放于网络的多个ORACLE数据库,逻辑上可以看成一个单一的大型数据库,用户可以通过网络对异地数据库中的数据进行存取,而

物理上存放于网络的多个Oracle数据库,逻辑上可以看成一个单一的大型数据库,用户可以通过网络对异地数据库中的数据进行存取,而服务器之间的协同处理对于工作站用户及应用程序而言是完全透明的,开发人员无需关心网络的链接细节、数据在网络节点中的具体分布情况和服务器间的协调工作过程。
数据库之间的链接建立在DATABASE LINK上。要创建一个DATABASE LINK,必须首先在建立链接的数据库上设置链接字符串,即配置一个远程数据库的本地网络服务名。
链接字符串的配置参见《客户端连接服务器》一节。
数据库全局名称可以用以下命令查出:
SELECT * FROM GLOBAL_NAME;
修改可以用以下语句来修改参数值:
ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
、当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。
oracle数据库之间进行连接通讯。
创建数据库链接的语法如下:
CREATE DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’
其中:
--demona为用net8 easy config创建的连接字符串
目的方数据库的init.ora文件中的global_names设为false
重新启动数据库设置才能生效
或者用sys用户执行
注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。
一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
创建数据库链接时,还可以使用缺省登录方式,即不指定远程数据库的用户名和密码:
create public database link zrhs_link
using ‘zrhs’;
在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库。
USING后面指定的是链接字符串,也就是远程数据库的网络服务名,这个服务名保存在TNSNAMES.ORA文件中,在该文件中定义了协议、主机名、端口和数据库名。
(如果有两台数据库服务器db_A和db_B,db_A下用户user_a需要用database link访问到db_B下user_b的数据时,有如下步骤:1、首先用户user_b,这个用户必须要有select 权限.2、在db_B上的tnsnames.ora中需要建立一个连接字符串tnsname_BtoA,可以从db_B连接到db_A。3、在db_A上的tnsnames.ora中需要建立一个连接字符串tnsname_AtoB,可以从db_A连接到db_B。4、然后在登陆到db_A上建立db link,格式如下: create database link link_AtoB_name connect to user_b identified by user_b的password using ’tnsname_AtoB’; link_AtoB_name必须是远程数据库的全局名(SID), tnsname_AtoB就是到远程的连接字符串。5、测试是否能够读取数据。select * from dual@link_AtoB_name结果为: DUMMY X表示设置成功。)
删除数据库链接的语句是:
DROP DATABASE LINK zrhs_link
数据库链接的引用
一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符:
SELECT * FROM worker@zrhs_link;
对于经常使用的数据库链接,可以建立一个本地的同义词,,方便使用:
CREATE SYNONYM worker_syn FOR worker@zrhs_link;
还可以建立一个本地的远程视图,方便使用:
CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where? ;
现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户,访问此视图,但该用户必须有访问数据库链接的权限。
对于另外一种情况,所要访问的表不在数据库链接中指定的远程帐户下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名:
SELECT * FROM camel.worker@zrhs_link ;
、当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
atabase link(dblink)--数据库链路
创建dblink的语法:
sql》create database link 数据库链路名
connect to 用户名 identified by 口令
using ’主机字符串名’;
如:
sql》create database link ora9i.us.oracle.com ### 这里的us.oracle.com为oracle默认域名 ###
connect to scott identified by tiger
using ’sun’;
1)dblink名必须与远程数据库的全局数据库名(global_name)相同;
2)用户名,口令为远程数据库用户名,口令;
3)主机字符串为本机tnsnames.ora中定义的串;
4)两个同名的数据库间不得建立dblink;
然后,你就可以通过dblink访问远程数据库了。
如:
sql》select * from 表名@ora9i.us.oracle.com;
还可以建立快照(snapshot)通过dblink实现远程数据自动传输。
查看所有的数据库链接,进入系统管理员SQL》操作符下,运行命令:
SQL》select owner,object_name from dba_objects where object_type=’DATABASE LINK’;

ORACLE临时表总结

  临时表概念
  临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在临时表空间,而非用户的表空间。ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
  临时表语法
  clip_image002
  临时表分类
  ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。
  1)ON COMMIT DELETE ROWS
  它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
  2)ON COMMIT PRESERVE ROWS
  它表示临时表的内容可以跨事物而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
  1:会话级的临时表的数据和你当前会话有关系,当前SESSION不退出的情况下,临时表中的数据就还存在,临时表的数据只有当你退出当前SESSION的时候才被截断(TRUNCATE TABLE),如下所示:
  会话级别的临时表创建:
  复制代码
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT PRESERVE ROWS;
  或
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS
  AS
  SELECT * FROM TEST;
  操作示例:
  SQL》 CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT PRESERVE ROWS;
  Table created
  SQL》 INSERT INTO TMP_TEST
  SELECT 1, ’kerry’ FROM DUAL;
  1 row inserted
  SQL》 COMMIT;
  Commit complete
  SQL》 SELECT * FROM TMP_TEST;
  ID         NAME
  ---------- ----------------
  1         kerry
  SQL》 INSERT INTO TMP_TEST
  SELECT 2, ’rouce’ FROM DUAL;
  1 row inserted
  SQL》 ROLLBACK;
  Rollback complete
  SQL》 SELECT * FROM TMP_TEST;
  ID           NAME
  ---------- ----------------------
  1           kerry
  SQL》
  复制代码
  2:事务级的临时表(默认),这种类型的临时表与事务有关,当进行事务提交或者事务回滚的时候,临时表的数据将自行截断,即当COMMIT或ROLLBACK时,数据就会被TRUNCATE掉,其它的特性和会话级的临时表一致。
  事务级临时表的创建方法:
  复制代码
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT DELETE ROWS;
  或
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
  SQL》 CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT DELETE ROWS;
  Table created
  SQL》 INSERT INTO TMP_TEST
  SELECT 1, ’kerry’ FROM DUAL;
  1 row inserted
  SQL》 SELECT * FROM TMP_TEST;
  ID           NAME
  ---------- ----------------------
  1           kerry
  SQL》 COMMIT;
  Commit complete
  SQL》 SELECT * FROM TMP_TEST;
  ID            NAME
  ---------- ------------------------
  SQL》
  复制代码
  3:关于临时表只对当前会话或事务可见。每个会话只能查看和修改自己的数据。
  用DM用户登录数据库,打开SESSION 1后,创建临时表TMP_TEST
  复制代码
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT DELETE ROWS;
  或
  CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
  SQL》 CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  (
  ID NUMBER ,
  NAME VARCHAR2(32)
  ) ON COMMIT DELETE ROWS;
  Table created
  SQL》 INSERT INTO TMP_TEST
  SELECT 1, ’kerry’ FROM DUAL;
  1 row inserted
  SQL》 SELECT * FROM TMP_TEST;
  ID           NAME
  ---------- ---------------------
  1 kerry
  SQL》 COMMIT;
  Commit complete
  SQL》 SELECT * FROM TMP_TEST;
  ID           NAME
  ---------- -----------------------
  SQL》
  复制代码
  用sys用户登录数据库,打开SESSION 2
  SELECT * FROM DBA_TABLES WHERE TABLE_NAME=’TMP_TEST’ --可以查到临时表数据
  SELECT * FROM DM.TMP_TEST; --查不到数据,即使TMP_TEST临时表存在数据。
  临时表与永久表区别
  复制代码
  SQL》 SELECT TABLE_NAME, TABLESPACE_NAME,"LOGGING",
  "TEMPORARY", DURATION, "MONITORING"
  FROM DBA_TABLES WHERE TABLE_NAME IN (’TMP_TEST’, ’TEST’) ;
  TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING
  ------------- -------------- ------- --------- ----------- ---------
  TEST TBS_EDS_DATA YES N YES
  TMP_TEST NO Y SYS$SESSION NO
  复制代码
  如上所示,临时表是存储在临时表空间里面的,但是上面脚本可以看出,临时表在数据字典中没有指定其表空间,临时表是NOLOGGING,DURATION为SYS$SESSION
  临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少其实在应用中,往往会创建一个NOLOGGING的永久表(中间表)来保存中间数据,从而代替临时表,至于这这两者有啥优劣,真是很难说清道明(欢迎大家探讨)。
  临时表用途
  什么时候使用临时表?用临时表和用中间表有啥区别呢?
  我觉得是在需要的时候应用,下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。
  1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。
  2:当某些表在查询里面,需要多次用来做连接时。(为了获取目标数据需要关联A、B、C, 同时为了获取另外一个目标数据,需要关联D、B、C....)
  关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。
  注意事项
  1 ) 不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。这点网上很多资料都这么说,我没有追查到底是那个版本不支持lob对象,至少在ORACLE 10g这个版本中,临时表是支持lob对象的.
  SQL》 CREATE GLOBAL TEMPORARY TABLE TMP_TEST
  2 (
  3 ID NUMBER ,
  4 NAME CLOB
  5 ) ON COMMIT PRESERVE ROWS;
  Table created
  SQL》
  SQL》 INSERT INTO TMP_TEST
  2 SELECT 1, ’ADF’ FROM DUAL;
  1 row inserted
  SQL》 SELECT * FROM V$VERSION;
  BANNER
  ----------------------------------------------------------------
  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
  PL/SQL Release 10.2.0.1.0 - Production
  CORE 10.2.0.1.0 Production
  TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
  NLSRTL Version 10.2.0.1.0 - Production
  2 ) 不支持主外键关系
  3 )临时表不能永久的保存数据。
  4 )临时表的数据不会备份,恢复,对其的修改也不会有任何日志信息
  5 )临时表不会有DML 锁
  DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.
  6 )尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。请见官方文档:
  DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as during a session or instance failure.
  7 ) 临时表可以创建临时的索引、视图、触发器。
  8 ) 如果要DROP会话级别临时表,并且其中包含数据时,必须先截断其中的数据。否则会报错。
  SQL》 DROP TABLE TMP_TEST PURGE;
  DROP TABLE TMP_TEST PURGE
  ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
  SQL》 TRUNCATE TABLE TMP_TEST;
  Table truncated
  SQL》 DROP TABLE TMP_TEST PURGE;
  Table dropped

SQLServer2005移植到Oracle10g经验总结

  此次需要完成的目标是将库从SQLServer 完整的移植到Oracle g中 包括表结构 数据 视图 函数以及存储过程的移植 移植主要基于Oracle的OMWB(Oracle Migration Workbench)来完成 尽管OMWB能帮助完成大部分具备难度的工作 但还是有很多工作量的事情需要在OMWB完成后来手工进行 所以整个移植过程工作量看起来会非常大 但是不是仅仅只有工作量的问题呢?我觉得不是 写下这篇blog以便需要进行此项操作的同学以及给自己做个备忘

  由于目前OMWB仅支持SQLServer 根据官方网站的消息 OMWB的下一版会推出对SQLServer 的支持 所以在目前的情况下只能先把库从SQLServer 移植到SQLServer 这就是我们移植过程的第一步了

  一 SQLServer 》SQLServer

  一直以来 版本要降级都是很困难的 因为在新版本中必然会有些新的特性 而如果刚好凑巧你使用到了这些特性的话 在降级到低版本时就会碰到一些问题 在经过几次的尝试后 总结而言 这个过程还是比较容易做的 毕竟是同样的数据库 再怎么样也不会出太大的问题 不过也没有像将库从SQLServer 升级为SQLServer 那么简单 整个移植过程这么进行

   基于SQLServer 的数据导出将表结构和数据导入到SQLServer

  这步中需要注意的是默认情况下SQLServer会将表和视图一起导入 在这里不要选择视图 否则导入到SQLServer 后有些视图会变成表 选择需要导入的表后基本上这步不会出现什么问题 可以完成表结构和数据的移植

   基于SQLServer 的生成脚本将视图/函数/存储过程移植到SQLServer

  这步需要慢慢来 因为在视图/函数/存储过程中你可能使用到了一些SQLServer 的新特性 如果碰到这样的情况 只能是手工进行修改 以使它完全符合SQLServer 的要求 尽管在生成脚本时你可以选择生成的目标版本为SQLServer 但还是会有部分脚本执行是会出错的

  在完成了SQLServer 到SQLServer 的移植后 就可以基于OMWB来把库从SQLServer 移植到Oracle了 这步尽管有工具 还是会比较的麻烦 总结如下

  二 SQLServer 》Oracle g

  关于如何基于OMWB将库从SQLServer 移植到Oracle g的操作步骤可参见此篇文档

  op/omwb/

  大家现在从oracle官方站下的话可能会找不到sqlserver 的插件包 如果找不到的话可以从这里下载

  我在这里要总结的是基于OMWB将库从SQLServer 移植到Oracle g后还需要手工做的一些事情 不要指望OMWB能无缝的帮你把库从SQLServer移植到Oracle中 银弹是不存在的 因此我们需要做些手工的工作完成库的移植

   移植表结构和数据可能会出现的问题

  表中字段的默认值/主键/外键/索引移植不过去 这些需要手工的进行补充

   移植视图可能会出现的问题

  移植过去的视图可能会出现各种语法错误的问题 这需要手工的修正 一般来说都是较为简单的错误

  另外一种问题就是有些视图可能会无法移植过去 这些视图就只能在对比OMWB的移植报告后找出来手工的进行移植了

   移植函数/存储过程可能会出现的问题

  移植过去的函数/存储过程中可能仍然会有不少的语法问题 例如像SCOPE_IDENTITY() REPLICATE newid()这些OMWB不知道该怎么处理的函数 还有像返回Table类型的这种函数 这些都只能在移植后手工的来进行纠正 关于函数不同造成的语法错误的现象大家可以参看这篇文档来做SQLServer和Oracle函数的对照

  ?logID=

  移植过去的函数/存储过程可能编译是没有问题 也就是Oracle认为没有语法问题 但执行起来却会报错 像字符串相加 经过OMWB移植后有些字符串相加会替换成|| 但是有些会遗漏 这个时候也只能手工来纠正这些错误了

  移植过去的函数/存储过程在执行过程中可能会出现某些表的主键值不能为空的现象 造成这种现象的原因多数为在SQLServer中该字段的默认值定义的为IDENTITY 但在Oracle中没法赋予这样的默认值 只能在插入的sql语句中加上对于主键字段的赋值 可采用sequence的方式来生成顺序号

  移植过去的函数/存储过程中如果其中的查询语句是采用字符串的方式 然后动态执行的话 这个时候的查询语句就得手工修改为符合oracle的语法了 因为OMWB在移植时是不会对字符串形式的查询语句来做处理的

  部分函数/存储过程会由于OMWB确实无法处理 造成移植不到oracle 这个时候也必须参照OMWB的移植报告找出这些函数/存储过程来手工移植了

  整个移植过程可能会碰到比上面所列出的更多的别的问题 可以看出整个移植过程确实需要耗费不小的工作量 但总体而言 完成的难度并不高

  其实真的是这样吗?当然不是 就算你完成了上面的移植工作 那也只能说表面看上去移植是完成了 很有可能会出现这个存储过程语法等等都没有问题了 但执行的效果和SQLServer就是不一样 这是为什么呢?可能会是因为Oracle和SQLServer在并发控制 事务机制上是不同的 而这会影响到程序调用时的sql的编写 存储过程的编写等等 也就是说 在上面的移植过程的工作完成后 还得仔细检查现在的sql语句/函数/存储过程是否根据Oracle的机制达到了原来在SQLServer中期望的效果 只有做到这步的效果是一样的 才可以说移植过程完成了

  最后顺带说的就是应该根据Oracle的机制来采用符合oracle优化原则的方法来优化表/视图/函数/存储过程 如果不做这步的话 从sqlserver移植到oracle估计意义也不大了 当然 这可以不列为移植过程的工作

lishixinzhi/Article/program/Oracle/201311/16982

请高手帮忙指点下oracle,我在做个学习总结

all_col_comments 视图里面一共有四个字段,分别为owener ,table_name , column_name ,comments,分别的意思是表的所有者,表名,字段名,字段的注释。
对表的某一列添加注释语法为:comment on column tableName.columnName is ’注释’

oraclePL/SQL之隐式游标和ref游标总结

  游标是构建在PL/SQL中 用来查询数据 获取记录集的指针 它让开发者 一次访问结果集中一行记录 在oracle中提供了两种游标 静态游标 ref游标

  静态游标 静态游标是在编译的时候就被确定 然后把结果集复制到内存中 静态游标又分为两种 隐式游标和显示游标

  ref游标 ref游标是在运行的时候加载结果集

  先来看看静态游标中的隐式游标 在PL/SQL中为所有的SQL数据操纵语句(包括返回一行的select)隐式声明游标 称为隐式游标 主要原因是用户不能直接命名和控制此类游标 当用户在PL/SQL 中使用数据操纵语句(DML)时 oracle预先定义一个名称为SQL的隐式游标 通过 检查隐式游标的属性获取与最近执行的SQL语句相关信息 在执行DML语句之后 隐式游标属性返回信息 隐式游标属性包括 %found %notfound %rowcount %isopen

   %found 只有DML语句影响一行或多行时 %found属性才返回true declare num number; begin update emp set empno= where empno= ; if sql%found then dbms_output put_line( 存在记录 ); else dbms_output put_line( 不存在记录 ); end if; end;

   %notfound %notfound属性作用正好跟%found属性相反 如果DML语句没有影响任何行数 则%notfound属性返回true declare begin delete from emp where empno= ; if sql%notfound then dbms_output put_line( 删除失败 ); end if; end;

   %rowcount %rowcount属性返回DML语句影响的行数 如果DML语句没有影响任何行数 则%rowcount属性将返回 declare num number; begin update emp set empno= where empno= ; if sql%rowcount= then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end;

   %isopen %isopen属性判断SQL游标是否已经打开 在执行SQL语句之后 oracle自动关闭SQL 游标 所以隐式游标的%isopen属性始终为false

  在PL/SQL中向标准的select语句增加单独的into子句 就可以将从表或视图中查询 记录赋予变量或行变量 需要注意的是select into 语句结果必须有且只能有一行 如果查询没有返回行 PL/SQL将抛出no_data_found异常 如果查询返回多行 则抛出 too_many_rows 异常 如果抛出异常 则停止执行 控制权转移到异常处理部分(没有 异常处理 则程序中断) 在引发异常时 将不使用属性%found %notfound %rowcount来查明DML语句是否 已影响了行数 declare num number; begin select empno into num from emp where empno= ; if sql%rowcount= or sql%notfound then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end;

  显示游标 显示游标是由用户显示声明的游标 根据在游标中定义的查询 查询返回的行集合可以 包含零行或多行 这些行称为活动集 游标将指向活动集中的当前行 显示游标的操作过程 使用显示游标的 个步骤 ( )声明游标 ( )打开游标 ( )从游标中获取结果集 ( )关闭游标 cursor cursor_name is select_statement; cursor_name 指游标的名称 parameter   为游标指定输入参数 return_type 定义游标提取行的行类型 select_statement 为游标定义查询语句 open 游标名称 fetch 从游标中提取行 close 关闭游标

   打开游标 执行游标中定义的查询语句 绑定输入参数 将游标指针指 向结果集的BOF位置 open cursor_name

      fetch 在打开游标之后 可以从游标中提取记录 fetch cursor_name into variable_name; fetch 是提取结果集中一行记录存储在变量中 每次提取之后 结果集指针 就向前移动一行

   close 在处理游标中的所有行之后 必须关闭游标 以释放分配给游标的所有资源 close cursor_name 用户可以通过检查游标属性来确定游标的当前状态 显示游标的属性如下 %found 如果执行最后一条fetch语句 成功返回行 则%found属性为true %notfound 如果执行最后一条fetch语句 未能提取行 则%notfound属性为true %isopen:如果游标已经打开 则返回true 否则返回false %rowcount 返回到目前为止游标提取的行数 %rowcount为数字类型属性 在第一 次获取之前 %rowcount为零 当fetch语句返回一行时 则该数加 declare info emp%rowtype; cursor my_cur is select * from emp where empno= ; begin open my_cur; dbms_output put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output put_line(info empno); dbms_output put_line(my_cur%rowcount); end if; end loop; close my_cur; end;

  使用显示游标删除或更新 使用游标时 如果处理过程中需要删除或更新 在定义游标查询语句时 必须使用select for update语句 而在执行delete或update时使用 where current of 子句指定游标当前行 cursor cursor_name is select_statement for update wait/nowait 在使用for update 子句声明游标之后 可以使用以下语法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必须出现在for update of 子句中 select 语句必须只包括一个表 而且delete和update语句只有在打开游标并且提取 特定行之后才能使用 declare cursor cur_emp is select * from emp where sal《 for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal= where current of cur_emp; end loop; close cur_emp; end;

  带参数的显示游标 PL/SQL中允许显示游标接受输入参数 用于声明带参数的显示游标语法 cursor cursor_name is select_statement declare dept_num emp deptno%type; emp_num   emp empno%type; emp_nam emp ename%type; cursor emp_cur(deptparam number) is select empno ename from emp where deptno=deptparam; begin dept_num :=&部门编号; open emp_cur(dept_num); loop fetch emp_cur into emp_num emp_nam; exit when emp_cur%notfound; dbms_output put_line(emp_num|| ||emp_nam); end loop; close emp_cur; end;

  可以使用循环游标来简化显示游标 循环游标隐式打开显示游标(不需要open) 自动从结果集提取记录 然后处理完所有记录自动关闭游标 循环游标自动创建 %rowtype类型的变量并将此变量用做记录的索引 循环游标语法如下 for record_index in cursor_name record_index是PL/SQL自动创建的变量 此变量的属性声明为%rowtype类型 作用 域for循环之内 循环游标的特性有 从游标中提取所有记录之后自动关闭游标 提取和处理游标中每一条记录 提取记录之后%notfound属性为true则退出循环 如果未有结果集 则不进入循环 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output put_line(temp ename); end loop; end; 循环游标自动打开 提取 关闭 只适用于静态游标

  ref游标 隐式游标和显示游标都是静态定义的 它们在编译的时候结果集就已经被确定 如果想在运行的时候动态确定结果集 就要使用ref游标和游标变量

  创建ref游标需要两个步骤 声明ref cursor类型 声明 ref cursor类型变量 语法如下 type ref_cursor_name is ref cursor 其中 return 用于指定游标提取结果集的返回类型 有return表示是强类型ref游标 没有return表示是弱类型的游标 弱类型游标可以提取任何类型的结果集 定义游标变量之后 就可以在PL/SQL执行部门打开游标变量 open cursor_name for select_statement; declare type emp_cur is ref cursor; my_cur emp_cur; num number; selection varchar( ):= &请输入编号 ; begin    if selection= then    dbms_output put_line( 员工信息 );    open my_cur for select deptno from emp;       elsif selection= then    dbms_output put_line( 部门信息 );    open my_cur for select deptno from dept;       else    dbms_output put_line( 请输入员工信息( )或门部信息( ) );    end if;    fetch my_cur into num;    while my_cur%found    loop    dbms_output put_line(num);    fetch my_cur into num;    end loop;    close my_cur;    end;

  在PL/SQL中可以执行动态SQL语句 execute immediate 语句只能语句处理返回单行 或没有返回的SQL语句 ref游标则可以处理返回结果集的动态SQL ref游标的声明 方法与普通ref游标相同 只是在open时指定了动态SQL字符串 open cursor_name for dynamic_select_string declare type sql_cur is ref cursor; my_cur sql_cur; emp_info emp%rowtype; sql_string varchar ( ):= &请输入查询字符串 ; begin open my_cur for sql_string; loop fetch my_cur into emp_info; exit when my_cur%notfound; dbms_output put_line(emp_info ename); end loop; close my_cur; end;

lishixinzhi/Article/program/Oracle/201311/18462

自己总结的oracle开发中需要注意的几点



1、表关联问题最好不要关联3个以上的表格例子:
工资表a 公积金表b医保表 c
如果工资表中 a 存在职工号12365,而b表中没有12365数据
如果关联条件为 a. 工号=b. 工号(+) 则会出错,关联后
缺少工号为12965记录,因为B 表没有该条记录
最好用union all 把数据放到一起。
2、使用表中字段分组时最好,使用英文编码数据,如果使用中文数据容易出错例如用姓名分组,容易出错,因为有可能同名
3、多表关联时为了数据的正确性应该加外连接,如果是两个字段的关联,则需要都加外关联,否则会少记录。
当多表关联时,由于每个表数据不一致,必须选择一个表做为标准,并使用外连接。
4、当视图层次非常多,速度比较慢时可以使用把视图中的数据放在中间表里
5、为了优化sql语句,尽量少使用模糊查询。
6当涉及计算金钱等数值型数据求和时,必须要进行非空判断,否则容易出现错误。
7、序列的作用可以通过定义序列来生成一个表的主键。
8、Update 的子查询的数据源最好是表而不是视图,因为表的速度要比视图快很多。
9、当写触发器的时候,出现表层触发器不允许的情况时,
原因为表级触发器不允许使用new old。
自己总结的oracle开发中需要注意的几点
标签:必须否则数据源upd很多一个表数需要查询

使用oracle数据库总结

去ORACLE的网站下载一个个人版本的ORACLE安装程序,下个10G版本吧
然后安装,全点下一步,或者你看他给你的中文提示下一步安装就可
建立数据库的话安装会给你装的
装完要配置NET MANAGER里的监听程序 点添加数据库 输服务名和路径
然后还要配置服务名
然后就可以用SQL PLUS登陆了
默认的帐户
sys 密码 change_on_install
system密码 manager
装完cmd sqlplus /nolog 然后conn sys/change_on_stall as sysdba
默认的话会有个样本用户scott下面有一些表 里面还有数据,但是scott用户默认是锁定的,上面conn sys/change_on_stall as sysdba以后,再输alter user scott account unlock;然后就可以conn scott/tiger了,然后就可以select * from emp;了记得连接完后一般SQL语句都要用‘;’分号结束。
简单说了下,里面还有很多细节,可以加我HI BAIDU
最好找本oracle 10g入门的书看看

Oracle数据库视图管理经验技巧

  视图 对于数据库来说 是一个最基本的 也是最重要的功能之一 数据库视图设计的好坏 直接跟数据库的性能相关 而且 在大型数据库设计中 大家分工合作 基础表的设计与报表视图的设计往往由不同的人负责 所以 视图的设计管理跟基础表的设计管理一样 都有很大的学问 在这篇文章中 笔者将结合自己在视图设计管理方面的工作经验 谈谈在这方面的一些鲜为人知的技巧

   技巧一 把基础表与视图脱离开来

  一般来说 视图都是在基础表的上面建立起来的 也就是说 要先有基础表 而后有视图 但是 在大型数据库的设计过程中 出于项目时间的考虑 往往基础表与视图的设计是同时进行的 如一些人负责基础表的建立 另一些人则负责视图的设计与建立等等 在这个过程中 往往基础表不存在的时候 就需要建立一些视图 以加快项目的进度

  为了使得基础表的创建和修改与视图的创建于修改没有必然的联系 以便于员工之间工作的同步 提高工作效率 所以 在Oracle数据库中提出了一个 强制创建视图 的概念 也就是说 正常情况下 如果基本表不存在 则创建视图就会失败 但是 我们可以在创建视图的过程中 加入一个参数 只要创建视图的语法没有错误的话 即使基础表不存在 仍然可以建立这张表格 这个有用的参数就是force选项 如我们建立视图时 CREATE FORCE VIEW TEXT 只需要在关键字VIEW之前加入FORCE参数即可 如此的话 系统在编译视图的时候 就不会去考虑基础表是否存在

  不过这里要注意一点 若基础表不存在的话 则编译后该视图的状态为 无效 不能再这个视图的基础上执行一些操作 如查询操作等等 当下次访问这个视图的时候 则数据库会对这个视图进行重新编译 若此时基础表存在了 则该基础表就会变为有效;若基础表不存在 则这视图就会失效

  Oracle数据库之所以如此设置 主要是出于在数据库设计过程中协同办公的需要 有了这个功能之后 则在数据库建立的过程中 只要把数据库基础表与视图设计好之后 大家就可以分工合作 在数据库中建立相关的对象 不然的话 要等基础表建立好之后再建立视图 如此就会明显的影响数据库建立的进度 所以 在数据库建立的过程中 特别是中大型的数据库系统 这是一个很实用的功能

   技巧二 创建视图的理想步骤

  无论是简单视图 还是比较复杂的视图 笔者觉得数据库管理员在创建视图的时候 最好能够遵循一定的步骤 这一方面是因为视图的更改相对来说 是一件比较麻烦的工作 所以 我们在建立视图的时候 要确保视图的准确性 另一方面 视图是基础表的一个体现形式 若不按步骤来做的话 有可能就不能够达到我们预计的需求

  当然这个步骤没有官方的版本 完全是数据库管理员根据实际的经验总结出来的 这个步骤不仅对Oracle数据库有效 对于其他数据库来说 也是类似的道理

  一般来说 视图创建可以分为五步走

  第一步 先考虑Select语句的编写 我们知道 视图其实就是一个Select语句的集合 所以 我们建立视图的第一步 就是考虑这个Select语句该如何编写 这个Select语句编写的是否合理 执行效率的高低直接影响着这个视图的性能 另外 在Select语句中 可能还会有格式的控制 内容的编排等等 如在Select语句中 可以把一些字段合并成一个字段;也可以把相关的内容进行倒置等等 这些功能都是Select语句完成的 所以可以这么说 Select语句的编写是视图建立的基础

  第二步 对这个Select语句进行测试 当我们编写好Select语句之后 就需要在数据库中执行这条语句 看其能否查询到我们想要的值 在对Select语句进行测试的时候 需要注意一个问题 有时候Select查询语句可以查到准确的数据 但是在以这条语句建立视图的时候 可能就会通不过 如在一些表之间的连接查询的时候 如果两个表中有个字段名相同 是可以的 因为他们除了字段名字之外 还有表名一起来定义这个字段 如A name与B name 这是不算重名的 但是 若在建立视图的时候 这就会被认为是重复的列明 需要对其中的一个列名进行重定义 这一点在数据库视图建立的时候 要特别的注意

  第三步 考虑查询结果的准确性 通过查询语句把我们想要的结果查询出来后 我们就需要看看这个结果是否满足我们的需要 在这个过程中 我们主要注意两点 一是形式字段是否齐全 在一些应用系统中 若数据库的视图要能够被前台的应用程序调用的话 则必须包含一些形式字段 如笔者以前在设计一个ERP系统的时候 若前台系统要调用数据库中的视图的时候 必须包含记录更新时间 更新者 记录创建时间 创建者等相关信息 若缺乏这些信息的话 则前台调用这张视图的时候 就会出现错误 故在考虑查询结果准确性的问题的时候 就要考虑到前台应用程序的需要 看看这些形式字段是否齐全 二是实体内容的完整性 我们到底需要显示表中的哪些字段呢 这个我们在这里要确认清楚 若显示内容太多的话 则会影响视图的执行效率 而且也会降低视图的安全性作用;但是 若字段内容显示不足的话 则以后要添加字段的话 会比较麻烦 有一定的工作量 所以在这个检验的时候 需要根据视图的实际功用 确定视图需要显示的内容

  第四步 视图的修饰 有时候 为了阅读的方便 我们需要对查询结果进行一些修饰 如现在有两张表 一张是员工基本信息表 这表中有员工姓名 员工职位编号等等;另一张表是职位基本信息表 在这表中有职位编号 职位名称 我们希望在视图中能够如下显示 职位 员工名字 如数据库工程师 Victor 也就是说 把两个字段合并起来 并且在中间加入一个冒号 这些格式性的内容都是在查询的时候实现的 所以 我们确认查询的结果没有错误之后 接下来就要确认格式问题 若能够在视图中规范这些格式问题 则前台的程序设计就会相对来说比较简单

lishixinzhi/Article/program/Oracle/201311/17034

OK,关于oracle课程总结报告和在Oracle下如何创建databaselink全面总结的内容到此结束了,希望对大家有所帮助。

oracle课程总结报告(在Oracle下如何创建databaselink全面总结)

本文编辑:admin

更多文章:


dialogue英文意思(dialogue是什么意思)

dialogue英文意思(dialogue是什么意思)

大家好,dialogue英文意思相信很多的网友都不是很明白,包括dialogue是什么意思也是一样,不过没有关系,接下来就来为大家分享关于dialogue英文意思和dialogue是什么意思的一些知识点,大家可以关注收藏,免得下次来找不到哦

2025年10月23日 14:30

misunderstand用法(understand的反义词)

misunderstand用法(understand的反义词)

“misunderstand用法”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看misunderstand用法(understand的反义词)!本文目录understand的反义词misunderstanding后跟什么介词

2025年12月9日 00:45

mutual proofreading(mutual造句)

mutual proofreading(mutual造句)

本篇文章给大家谈谈mutual proofreading,以及mutual造句对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录mutual造句mutual affinity是什么意思mutual造句mutual造句如下:1、F

2026年3月16日 16:00

excel中四舍五入取整数(如何在excel表格中进行四舍五入取整呢)

excel中四舍五入取整数(如何在excel表格中进行四舍五入取整呢)

各位老铁们好,相信很多人对excel中四舍五入取整数都不是特别的了解,因此呢,今天就来为大家分享下关于excel中四舍五入取整数以及如何在excel表格中进行四舍五入取整呢的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年2月7日 19:00

earliest(earliest怎么读)

earliest(earliest怎么读)

大家好,关于earliest很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于earliest怎么读的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录ear

2026年3月10日 21:45

ueditor表格默认属性修改(百度编辑器 Ueditor 初始内容默认 怎么做)

ueditor表格默认属性修改(百度编辑器 Ueditor 初始内容默认 怎么做)

本篇文章给大家谈谈ueditor表格默认属性修改,以及百度编辑器 Ueditor 初始内容默认 怎么做对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录百度编辑器 Ueditor 初始内容默认 怎么做ueditor怎么设置表格边

2026年8月21日 04:00

tomcat运行不了(为什么tomcat不能运行)

tomcat运行不了(为什么tomcat不能运行)

大家好,今天小编来为大家解答以下的问题,关于tomcat运行不了,为什么tomcat不能运行这个很多人还不知道,现在让我们一起来看看吧!本文目录为什么tomcat不能运行tomcat安装后运行不了windowtomcatshundown后启

2026年5月29日 17:00

grouplayout布局详解(在java中GroupLayout这个布局管理器的中文名叫什么绝对布局又应该怎么设置)

grouplayout布局详解(在java中GroupLayout这个布局管理器的中文名叫什么绝对布局又应该怎么设置)

各位老铁们,大家好,今天由我来为大家分享grouplayout布局详解,以及在java中GroupLayout这个布局管理器的中文名叫什么绝对布局又应该怎么设置的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的

2026年7月29日 22:30

linux图形化分区工具(请教Linux下图形化管理磁盘工具)

linux图形化分区工具(请教Linux下图形化管理磁盘工具)

本篇文章给大家谈谈linux图形化分区工具,以及请教Linux下图形化管理磁盘工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录请教Linux下图形化管理磁盘工具在操作系统中如何分区Linux下的分区工具和Fdisk使用方法

2025年12月2日 19:15

易语言写辅助容易被检测(易语言开发的软件都会被360提示为木马吗你怎么看)

易语言写辅助容易被检测(易语言开发的软件都会被360提示为木马吗你怎么看)

大家好,关于易语言写辅助容易被检测很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于易语言开发的软件都会被360提示为木马吗你怎么看的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希

2026年4月28日 12:30

免费java编辑器(Java开发工具哪个好)

免费java编辑器(Java开发工具哪个好)

这篇文章给大家聊聊关于免费java编辑器,以及Java开发工具哪个好对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录Java开发工具哪个好java代码的编辑软件(包括IDE)有哪些你认为哪个比较好用求好用的java开发工具现在

2025年9月4日 21:45

夏洛特与兔子漫画(夏洛特·E·叶格的动漫人物)

夏洛特与兔子漫画(夏洛特·E·叶格的动漫人物)

本篇文章给大家谈谈夏洛特与兔子漫画,以及夏洛特·E·叶格的动漫人物对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录夏洛特·E·叶格的动漫人物汇总动漫《海贼王》中,实力强大的七个女将,你知道是哪七个人吗有什么兽人类的漫画推荐吗动

2025年8月24日 20:00

oracle是什么意思翻译(oracle代表什么含义)

oracle是什么意思翻译(oracle代表什么含义)

本篇文章给大家谈谈oracle是什么意思翻译,以及oracle代表什么含义对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录oracle代表什

2026年5月21日 04:45

社交英语communicate(communicate 这个英语怎么读)

社交英语communicate(communicate 这个英语怎么读)

各位老铁们好,相信很多人对社交英语communicate都不是特别的了解,因此呢,今天就来为大家分享下关于社交英语communicate以及communicate 这个英语怎么读的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看

2026年1月31日 10:30

递归函数返回值(递归函数返回值问题)

递归函数返回值(递归函数返回值问题)

大家好,递归函数返回值相信很多的网友都不是很明白,包括递归函数返回值问题也是一样,不过没有关系,接下来就来为大家分享关于递归函数返回值和递归函数返回值问题的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录递归函数返

2025年6月18日 09:00

dockerattach卡住(docker exec 和 docker attach的区别)

dockerattach卡住(docker exec 和 docker attach的区别)

大家好,关于dockerattach卡住很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于docker exec 和 docker attach的区别的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还

2026年2月15日 03:30

borderradius是什么标签(border-radius是css3新增属性吗)

borderradius是什么标签(border-radius是css3新增属性吗)

大家好,关于borderradius是什么标签很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于border-radius是css3新增属性吗的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下

2025年12月16日 23:15

汇编语言论坛(如何学好汇编语言)

汇编语言论坛(如何学好汇编语言)

今天给各位分享如何学好汇编语言的知识,其中也会对如何学好汇编语言进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录如何学好汇编语言不会别的语言,可能直接学汇编语言么急 汇编语言fild dword ptr什么意思

2025年11月24日 07:15

charge词性转换(初三英语选择与词性转换)

charge词性转换(初三英语选择与词性转换)

其实charge词性转换的问题并不复杂,但是又很多的朋友都不太了解初三英语选择与词性转换,因此呢,今天小编就来为大家分享charge词性转换的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录初三英语选择与词性转换e

2026年4月8日 00:45

android车载app开发(Android车载应用开发与分析(2) - 集成第三方APK)

android车载app开发(Android车载应用开发与分析(2) - 集成第三方APK)

“android车载app开发”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看android车载app开发(Android车载应用开发与分析(2) - 集成第三方APK)!本文目录Android车载应用开发与分析(2) -

2025年12月17日 22:00

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索