天道酬勤,学无止境

是否允许在流水线 PL/SQL 表函数中使用 SELECT?(Is using a SELECT inside a pipelined PL/SQL table function allowed?)

问题

流水线函数的文档说,在 SQL 语句(通常是SELECT )中使用 DML 时不允许使用 DML,并且在大多数示例中,流水线函数用于数据生成或转换(接受 custor 作为参数),但不发出任何 DML 语句。

现在,从技术上讲,可以使用 SELECTs 而没有来自 Oracle 的任何错误(不会发生 ORA 14551)。 但是,我遇到了可重复的选择奇怪行为; 即使没有使用PRAGMA AUTONOMOUS_TRANSACTIONSELECT检索的行似乎并不总是考虑当前的本地事务,这对我来说就像一个错误。 更令人不安的是,当使用分布式事务(例如通过 ORAMTS 而不是本地事务)时,会使用事务。

编辑:事实证明,奇怪的效果似乎与查询中的一些 WITH 语句有关,这些语句有时有效,有时无效(取决于 Oracle 优化器的当前心情,至少在 10g 中)。 在某些情况下,我得到一个 ORA-32036,然后它又不会发生,根本不更改代码。 现在看起来好像有时会因 ORA-32036 失败的查询也无法使用正确的事务,并且它可能与流水线功能无关。

所以我的具体问题是:

  • 是否有任何(最好是官方的)声明是否允许流水线表函数中的SELECT以及它们的事务上下文是什么?

  • 是否有另一种方法可以模块化可在 SQL 语句中使用的常用查询(就像表函数可以使用TABLE() )?

  • 有没有人也经历过这种行为,也许对此了解更多? 我已经研究过 metalink,但不幸的是我没有找到任何关于该主题的具体内容。

回答1
  1. 通常 DML 限制只涉及修改 (UPDATE, DELETE ...) 语句,所以 SELECT 应该没问题。 我将尝试从 Oracle 中找到特定的声明。

  2. 视图将是您将常用查询模块化的第一个工具。

  3. 函数与视图相比有一个缺点:如果它们是从另一个 SELECT 调用的,它们不会在与主 SELECT 相同的时间点执行。 对 SELECT 的每次调用都是一致的,但由于 SELECT 在函数代码中而不是在主 SQL 中,因此您可能会返回不一致的结果。 这对于视图和子选择是不可能的:如果一个大语句调用一个视图,则视图是在与主查询相同的时间点构建的。

更新:关于您对参数化查询的评论

您可以构建参数化视图,即依赖于执行前设置的变量的视图。 这是 AskTom 上的一个示例,展示了如何使用userenv('client_info')dbms_session.set_context

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Oracle- 创建一个用于查询的临时结果集(Oracle- create a temporary resultset for use in a query)
    问题 如何在不创建表和插入数据的情况下创建用于 SQL 的临时结果集? 示例:我有一个列表,例如 10 个代码。 我想把这个放到查询中,然后查询数据库,看看这个临时列表中哪些代码在表中不存在。 如果它已经在表中,我可以执行以下操作: SELECT ITEM_CODE FROM TEMP_ITEMS MINUS SELECT ITEM_CODE FROM M_ITEMS 他们是一种不使用 PL/SQL 和纯 SQL 在查询之前创建临时行集的方法吗? 请不要用类似的东西来回答: SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL 我正在考虑可以在 IN 语句中提供代码的地方,并将其转换为行以供以后查询使用。 编辑:所以每个人都知道我在这里的目标,基本上我有时会得到一个产品代码列表,我需要找到列表中哪些没有在我们的系统中设置。 我想要一种快速的方法将其放入 SQL 语句中,以便我可以看到哪些不在系统中(而不是导入数据等)。 我通常将这些放入excel,然后做一个公式,例如: ="'"&A1&"'," 这样我就可以创建我的逗号分隔列表。 回答1 如果您使用的是 oracle 11g,则可以执行此操作 with t as ( select (column_value).getnumberval() Codes from xmltable('1,2
  • PL/SQL - 在流水线函数中立即执行(PL/SQL - execute immediate in pipelined function)
    问题 我想在我的流水线函数中执行动态查询并返回此查询的结果。 是否有可能做到这一点? 流水线函数方便我为我的应用程序实现良好的接口,因为它的行为就像一个表。 功能: CREATE OR REPLACE FUNCTION MyFunction(p_schema VARCHAR2) RETURN MyTableType Pipelined IS v_query VARCHAR2(1000); BEGIN v_query := 'SELECT * FROM TABLE ('||p_schema||'.somepackage.SomeFunction)'; --SomeFunction is another pipelined function EXECUTE IMMEDIATE v_query; --Results of the v_query are compatible with MyTableType's row type. But how to return them from pipelined function? END; 回答1 可以结合动态 SQL 和流水线函数,但返回类型不会是动态的:返回的列的数量和类型将是固定的。 您可以使用 EXECUTE IMMEDIATE 和BULK COLLECT (感谢@be here now)、动态游标或 DBMS_SQL 来返回多于一行
  • 如何从存储过程返回多行? (Oracle PL / SQL)(How to return multiple rows from the stored procedure? (Oracle PL/SQL))
    问题 我想用一个参数创建一个存储过程,该存储过程将根据参数返回不同的记录集。 有什么办法做到这一点? 我可以从普通SQL中调用它吗? 回答1 这是如何构建一个函数,该函数返回可以查询的结果集,就好像它是一个表一样: SQL> create type emp_obj is object (empno number, ename varchar2(10)); 2 / Type created. SQL> create type emp_tab is table of emp_obj; 2 / Type created. SQL> create or replace function all_emps return emp_tab 2 is 3 l_emp_tab emp_tab := emp_tab(); 4 n integer := 0; 5 begin 6 for r in (select empno, ename from emp) 7 loop 8 l_emp_tab.extend; 9 n := n + 1; 10 l_emp_tab(n) := emp_obj(r.empno, r.ename); 11 end loop; 12 return l_emp_tab; 13 end; 14 / Function created. SQL> select * from table
  • PL / SQL-IN CLAUSE中的逗号分隔列表(PL/SQL - comma separated list within IN CLAUSE)
    问题 我在获取pl / sql代码块的工作时遇到麻烦。 在过程的顶部,我从oracle apex应用程序中获取了有关选中了哪些复选框的数据。 由于包含复选框的报告是动态生成的,因此我必须遍历 APEX_APPLICATION.G_F01 列出并生成一个逗号分隔的字符串,如下所示 v_list VARCHAR2(255) := (1,3,5,9,10); 我想稍后再查询该列表,然后将v_list放在IN子句中,如下所示 SELECT * FROM users WHERE user_id IN (v_list); 这当然会引发错误。 我的问题是我可以将v_list转换为什么以便能够将其插入到pl / sql过程中的查询的IN子句中? 回答1 如果users很小,并且user_id不包含逗号,则可以使用: SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%' 尽管此查询不是最佳查询,因为它不能使用user_id索引。 我建议您使用流水线函数,该函数返回可以直接查询的NUMBER表。 例如: CREATE TYPE tab_number IS TABLE OF NUMBER; / CREATE OR REPLACE FUNCTION string_to_table_num(p VARCHAR2)
  • Oracle PL / SQL-立即输出/控制台打印的提示(Oracle PL/SQL - tips for immediate output / console printing)
    问题 我有许多pl / sql过程,可能需要几分钟才能运行。 在开发它们时,我添加了一些打印语句以帮助调试并提供一些反馈和进度指示器。 最初,我在小型测试仪上运行这些程序,并且输出几乎是瞬时的。 现在,我正在使用较大的测试集进行测试,该测试集需要花费几分钟才能运行,我发现不再适合打印到控制台,因为在过程结束之前不会打印任何内容。 我习惯于在不缓冲其输出并立即打印输出的环境中工作,并且添加用于简单调试和诊断的简单打印语句是很常见的。 是否可以在pl / sql中立即打印输出(未缓冲)? 如果没有,人们建议采用哪些替代方法以获得相似的结果? 回答1 您可以有一个使用自主事务将消息写到表的过程,例如: procedure log (p_message) is pragma autonomous_transaction; begin insert into message_log (user, datetime, message) values (user, sysdate, p_message); commit; end; 然后从另一个Oracle会话监视表。 回答2 为此,我们有一个小技巧。 您可以使用DBMS_APPLICATION_INFO.set_client_info(“这里的一些信息”); 创建一些变量并替换“”内的字符串。 并使用v $ session中的select
  • ORACLE SQL:获取两个数字之间的所有整数(ORACLE SQL:Get all integers between two numbers)
    问题 在Oracle中,有什么方法可以选择包含在两个数字之间的数字(整数); 我不想创建PL / SQL过程或函数。 例如,我需要获取3到10之间的数字。结果将是值3,4,5,6,7,8,9,10。 谢谢。 回答1 Oracle DUAL表的这一技巧也适用: SQL> select n from 2 ( select rownum n from dual connect by level <= 10) 3 where n >= 3; N ---------- 3 4 5 6 7 8 9 10 回答2 创建新数据库时,我要做的第一件事是创建并填充一些基本表。 一个是-N到N之间所有整数的列表,另一个是过去5年到将来10年之间的日期列表(计划的作业可以根据需要继续创建这些日期,向前移动),最后一个是列表全天的所有时间。 例如,inetgers: create table numbers (n integer primary key); insert into numbers values (0); insert into numbers select n+1 from numbers; commit; insert into numbers select n+2 from numbers; commit; insert into numbers select n+4 from
  • 是否可以从PL / SQL块输出SELECT语句?(Is it possible to output a SELECT statement from a PL/SQL block?)
    问题 如何获得PL / SQL块以输出SELECT语句的结果,就像执行普通的SELECT ? 例如,如何执行SELECT : SELECT foo, bar FROM foobar; 暗示 : BEGIN SELECT foo, bar FROM foobar; END; 不起作用。 回答1 这取决于您需要的结果。 如果确定只有1行,请使用隐式游标: DECLARE v_foo foobar.foo%TYPE; v_bar foobar.bar%TYPE; BEGIN SELECT foo,bar FROM foobar INTO v_foo, v_bar; -- Print the foo and bar values dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar); EXCEPTION WHEN NO_DATA_FOUND THEN -- No rows selected, insert your exception handler here WHEN TOO_MANY_ROWS THEN -- More than 1 row seleced, insert your exception handler here END; 如果要选择多于1行,则可以使用一个显式游标: DECLARE CURSOR cur
  • Oracle查询以查找字符串中所有出现的字符(Oracle query to find all occurrences of a charcter in a string)
    问题 我必须在蟾蜍中编写一个Oracle查询,以查找字符串中所有出现的字符。 例如,如果我在字符串SSSRNNSRSSR搜索R ,它将返回位置4、8和11。 我是Oracle的新手,并尝试了此方法。 select instr(mtr_ctrl_flags, 'R', pos + 1, 1) as pos1 from mer_trans_reject where pos in ( select instr(mtr_ctrl_flags, 'R', 1, 1) as pos from mer_trans_reject ); 其中mtr_ctrl_flags是列名。 我收到一条错误消息,指示pos是无效的标识符。 回答1 扩展GolezTrol的答案,您可以使用正则表达式来显着减少您执行的递归查询的数量: select instr('SSSRNNSRSSR','R', 1, level) from dual connect by level <= regexp_count('SSSRNNSRSSR', 'R') REGEXP_COUNT()返回模式匹配的次数,在这种情况下, R在SSSRNNSRSSR存在的SSSRNNSRSSR 。 这将递归级别限制为所需的确切数量。 INSTR()只是在字符串中搜索R的索引。 level是递归的深度,但是在这种情况下,它也是字符串的第th次出现
  • 从 PLSQL 关联数组中选择?(Select from PLSQL Associative array?)
    问题 使用关联数组时是否可以使用 SELECT FROM? 我正在通过 .NET 应用程序将数组传递给存储过程,并且我希望能够在从另一个表中进行选择时使用该数组作为条件。 假设我将一组 ID 传递给该过程,我希望能够做到这一点: select * from table1 where userID in (select column_value from array) 数组的类型在包中定义: type id_array is type of number index by pls_integer 回答1 是的,通过使用流水线函数包装数组是可能的。 这是关于流水线函数的一个很好的入门: http://www.oracle-developer.net/display.php?id=429 更新:Oracle 12c 现在支持使用 TABLE 运算符查询关联数组,只要该类型在包规范中声明:https://galobalda.wordpress.com/2014/08/02/new-in-oracle-12c-查询关联数组在 plsql 程序/ 例如 select * from table1 where userID in (select column_value from table(array)); 回答2 不,您不能从 PL/SQL 数组中进行select from
  • PreparedStatement IN子句替代项?(PreparedStatement IN clause alternatives?)
    问题 将SQL IN子句与java.sql.PreparedStatement实例一起使用的最佳解决方法是什么,由于SQL注入攻击安全性问题,多个值不支持SQL IN子句:一个? 占位符表示一个值,而不是值列表。 考虑以下SQL语句: SELECT my_column FROM my_table where search_column IN (?) 使用preparedStatement.setString( 1, "'A', 'B', 'C'" ); 在使用原因的变通方法上,这实际上是不可行的尝试? 首先。 有哪些解决方法? 回答1 此处提供了对各种可用选项的分析,以及每种选项的优缺点。 建议的选项是: 在SELECT my_column FROM my_table WHERE search_column = ?准备SELECT my_column FROM my_table WHERE search_column = ? ,对每个值执行该操作,并在客户端对结果进行UNION。 只需要一个准备好的语句。 缓慢而痛苦。 SELECT my_column FROM my_table WHERE search_column IN (?,?,?)准备SELECT my_column FROM my_table WHERE search_column IN (?,?,?)并执行它。
  • PLSQL Developer软件使用大全
    PLSQL Developer软件使用大全 第一章 PLSQL Developer特性PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。PL/SQL Developer主要特性:PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户需求。当您需要某个信息时,它将自动出现,至多单击即可将信息调出。集成调试器(要求Oracle 7.3.4或更高)——该调试器提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何程序单元(包括触发器和Oracle8 对象类型),无需作出任何修改。PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化
  • ​ PLSQL Developer软件使用大全
    PLSQL Developer软件使用大全 第一章 PLSQL Developer特性PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。PL/SQL Developer主要特性:PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户需求。当您需要某个信息时,它将自动出现,至多单击即可将信息调出。集成调试器(要求Oracle 7.3.4或更高)——该调试器提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何程序单元(包括触发器和Oracle8 对象类型),无需作出任何修改。PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化
  • 如何使用oracle从存储的函数中检索多行(How to retrieve multiple rows from a stored function with oracle)
    问题 我正在尝试在 oracle 中创建一个返回多行的存储函数。 我的问题与这个问题非常相似,只是我想获取一个select *查询 简而言之,我想创建一个返回此查询结果的函数 select * from t_email_queue 我试过的是这样的: create or replace PACKAGE email_queue AS type t_email_queue_type is table of T_EMAIL_QUEUE%ROWTYPE; FUNCTION lock_and_get return t_email_queue_type; END email_queue; create or replace PACKAGE BODY email_queue AS FUNCTION lock_and_get RETURN t_email_queue_type AS queue_obj t_email_queue_type; cursor c (lockid in varchar2) is select * from t_email_queue where lockedby = lockid; lockid varchar2(100) := 'alf'; BEGIN OPEN c(lockid); FETCH c bulk collect INTO queue_obj
  • PLSQL Developer软件使用大全
    今天给大家分享的是PLSQL Developer软件使用大全。PLSQL Developer软件使用大全 PLSQL Developer软件使用大全 第二章 PLSQL Developer配置 2.1 记住密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题。但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Developer记住密码。设置方法:菜单Tools --> Preferences --> Oracle --> Logon History --> Store With Password 重新登录再输入一次密码则记住了。上述方法若不好用,使用下面的方式:在上面所说的界面中的"Fixed Users"中,添加需要直接选择后就可登录的用户名/密码@ORACLE_SID,如:cbsdb/cbsdb@cbsdb重新登录的时候,从Oracle Logon的登录界面的Username后面的...按钮处,选择需要登录的用户即可。 2.2 SQL语句字符全部大写信息系统的核心是数据库,系统出问题时最先要查的就是SQL语句,怎样在浩瀚的日志中快速找到那条SQL语句是件比较痛苦的事情。 SQL语句全部大写并不能彻底解决这一问题,但在一堆代码中间找一行全部大写的字符相对容易些。设置方法:菜单Tools --> Preferences -->
  • oracle补充
    索引索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据的I/O次数,因此可以显著的提高性能创建索引的SQL把下面表中的name字段创建索引create index teachername on teacher(name);create index teachername2 on teacher(tid,age); --可以索引多个字段创建唯 一索引的SQLcreate unique index teacherhao on teacher(hao);create unique index teacherhao2 on teacher(hao,hao2);删除索引的SQLdrop index teachername;序列序列是Oracle提供的用于产生一系列唯一数字的数据库对象。 在某些数据表的结构中,有些字段需要这种特征: 比如,对于某个学生数据表的学号关键字段,用户可以希望在录入数据时,能够自动在上一个记录的学号字段上自动加1等。创建序列要有序列权限grant create sequence,select any sequence to 用户名--dba权限包括以上权限,所以不用重新赋予序列的创建CREATE SEQUENCE sequence --创建序列名称[INCREMENT BY n] -
  • TDH 4.6 technical release notes
    New Feature Inceptor[WARP-7124] - [ODBC] "一次绑定,多次执行" TDH 4.6 以后版本中的 ODBC 仅需绑定一次参数,就可以多次执行语句,简化了编写任务。[WARP-6982] - Holodesk GlobalIndex 为 Holodesk 新增了 GlobalIndex 特性。 [WARP-6899] - 图检索 TDH 4.6 推出了图检索功能,用函数 graph_path 指定待检索的图以及定义检索规则。 [WARP-7275] - [PLSQL] SQL 的语义检查 在存储过程的编译期对 SQL 的语义进行检查,例如对表不存在的情况报“TableNot Found”。 [WARP-5759] - Inceptor 数据库级别的权限管理 在 Inceptor 中实现数据库级别的权限管理,对一个数据库的权限管理操作等价于对该数据库中所有表的管理权限。 [WARP-6405] - 支持以 CSV 文件为数支持以 CSV 据源 文件为表的数据源,解决了字段中换行符的问题。 [WARP-7115] - 支持将内表数据导出 CSV 文件 支持将数据序列化为 CSV 文件格式。 [WARP-6533] - 将反序列化 CSV 的错误录入日志 4.6 及以后版本会将反序列化 CSV 文件时出现的错误写在日志里,以更好的支持以 CSV
  • 用于连续分组的 Oracle SQL(Oracle SQL for continuous grouping)
    问题 我需要从具有如下结构和数据的表中生成报告。 Table Ticket 有如下数据。 ID Assigned_To 100 raju 101 raju 102 raju 103 anil 104 anil 105 sam 106 raju 107 raju 108 anil Oracle SELECT应生成以下报告 From_Id To_Id Assigned_To 100 102 raju 103 104 anil 105 105 sam 106 107 raju 108 108 anil 有人可以帮我建立一个查询..? 提前致谢,马修。 回答1 SQL> create table ticket (id,assigned_to) 2 as 3 select 100, 'raju' from dual union all 4 select 101, 'raju' from dual union all 5 select 102, 'raju' from dual union all 6 select 103, 'anil' from dual union all 7 select 104, 'anil' from dual union all 8 select 105, 'sam' from dual union all 9 select 106, 'raju' from
  • Oracle--初学小白基础篇(第一版)
    文章目录 一、Oracle11g介绍1、Oracle11g安装和卸载Oracle11g安装Oracle11g卸载1、使用Oracle Universal Installer管理工具卸载2、使用`deinstall.bat`批处理文件卸载 2、Oracle管理工具①SQL*PLUS②PLSQL Developer③OEM(Oracle企业管理器) 二、Oracle11g体系结构1、Oracle为什么要有一个复杂的体系结构?2、Oracle数据库管理系统的体系结构1. Oracle服务器2. Oracle实例3. Oracle数据库4. 连接Oracle实例5. 服务器进程6. 后台进程6.1 LGWR6.2 DBWR6.3 SMON6.4 PMON6.5 CKPT6.6 ARCH 三、SQL基础1、简单查询2、where条件过滤3、group by子句分组查询4、having子句分组过滤5、order by排序6、多表关联查询7、Oracle常用函数1. 字符类函数2. 数字类函数3. 时间函数4. 聚合类函数 8、子查询的使用1. 单行子查询2. 多行子查询3. 关联子查询(重点) 9、DML语句:增删改1. INSERT2. DELETE3. UPDATE 10、事务处理1. 事务处理的结果2. 事务的4大特性(ACID)3. 事务的开始和结束事务的开始事务的结束 4
  • 被遗忘的赋值运算符“ =”和平常的“:=”(The forgotten assignment operator “=” and the commonplace “:=”)
    问题 PL / pgSQL的文档说,声明和变量赋值是通过:=完成的。 但是,一个简单,简短,更现代的方法(请参见脚注) =可以按预期工作: CREATE OR REPLACE FUNCTION foo() RETURNS int AS $$ DECLARE i int; BEGIN i = 0; WHILE NOT i = 25 LOOP i = i + 1; i = i * i; END LOOP; RETURN i; END; $$ LANGUAGE plpgsql; > SELECT foo(); 25 请注意,Pl / pgSQL可以清楚地区分赋值和比较,如该行所示 WHILE NOT i = 25 LOOP 因此,问题是: 我没有在文档中找到提及和/或解释此内容的部分吗? 使用=代替:=是否有任何已知的结果? 编辑/脚注: 请像“简短,不完整且最错误的编程语言历史”中提到的那样“眨眼”: 1970年-Niklaus Wirth创建了一种程序语言Pascal。 评论家立即谴责Pascal,因为它使用的是“ x:= x + y”语法,而不是更熟悉的类似C的“ x = x + y”。 尽管还没有发明C,但仍会发生这种批评。 1972年-丹尼斯·里奇(Dennis Ritchie)发明了一种功能强大的枪,可以同时向前和向后射击。
  • 数据库之Oracle笔试面试题收集(来自网络)
    数据库之Oracle笔试面试题收集(来自网络)问题:1、解释冷备份和热备份的不同点及各自的优点?2、解释归档和非归档模式之间的不同和它们各自的优缺点?****************************************************************************************************************************************************************************************解答:1、解释冷备份和热备份的不同点及各自优点?答: 1、不同点: 热备份:针对归档模式的数据库,在数据库处于工作状态时进行备份; 冷备份:适用于所有模式的数据库,在数据库关闭后进行备份。 2、各自优点: 热备份:当备份时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点; 冷备份:它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,不必将归档日志写入硬盘,数据库性能会比归档模式稍好。记忆方式:热备份>归档模式>工作时进行>恢复任意时间点 冷备份>所有模式>关闭时进行>少许提高性能2、解释归档和非归档模式之间的不同和它们各自的优缺点?答:归档模式是指可以备份所有的数据库transactions并恢复到任意一个时间点。 非归档模式则相反