标签: oracle-11g

将行转为多列

我有一个 SQL Server 实例,它具有到 Oracle 服务器的链接服务器。Oracle 服务器上有一个名为的表,PersonOptions其中包含以下数据:

???????????????????????
? PersonID ? OptionID ?
???????????????????????
?        1 ? A        ?
?        1 ? B        ?
?        2 ? C        ?
?        3 ? B        ?
?        4 ? A        ?
?        4 ? C        ?
???????????????????????
Run Code Online (Sandbox Code Playgroud)

我需要对这些数据进行透视,因此结果是:

????????????????????????????????????????????
? PersonID ? OptionA ? Option B ? Option C ?
????????????????????????????????????????????
?        1 ?       1 ?        1 ?          ?
?        2 ?         ?          ?        1 ?
?        3 ?         ? …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g pivot linked-server

22
推荐指数
3
解决办法
8万
查看次数

我可以更改 Oracle 数据库的 SID 吗?

服务器为 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit

是否有一种简单快捷的方法来更改服务器上测试数据库的 SID?

删除和重新创建数据库对我来说是一个选择。但我正在寻找需要更少时间的东西。

在客户端 tnsnames.ora 中分配名称的另一个选项容易出错,因为它们不是集中管理的。

与在 SQL-Server 上删除和创建数据库的时间相比,创建新的 Oracle 数据库所需的时间要多得多。进一步在 SQL-Server 上,您可以重命名 SQL-Server 实例。[通常您重命名运行 SQL-Server 的服务器并且在重命名服务器之前会遇到一些问题]。

oracle oracle-11g linux

20
推荐指数
3
解决办法
8万
查看次数

在 Oracle 中删除非常大的记录集的最佳方法

我管理一个应用程序,它有一个非常大的(近 1TB 的数据,一个表中有超过 5 亿行)Oracle 数据库后端。数据库并没有真正做任何事情(没有 SProcs,没有触发器或任何东西)它只是一个数据存储。

每个月我们都需要从两个主表中清除记录。清除的标准各不相同,是行年龄和几个状态字段的组合。我们通常最终每月清除 10 到 5000 万行(我们每周通过导入增加大约 3 到 500 万行)。

目前我们必须分批进行大约 50,000 行的删除(即删除 50000、提交、删除 50000、提交、重复)。尝试一次删除整个批次会使数据库在大约一个小时内没有响应(取决于行数)。像这样批量删除行在系统上是非常粗糙的,我们通常必须“在时间允许的情况下”在一周内完成;允许脚本连续运行会导致用户无法接受的性能下降。

我认为这种批量删除也会降低索引性能,并有其他影响最终导致数据库性能下降。一张表就有34个索引,索引的数据量实际上比数据本身还大。

这是我们的一位 IT 人员用来执行此清除操作的脚本:

BEGIN
LOOP

delete FROM tbl_raw 
  where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;

  exit when SQL%rowcount < 49999;

  commit;

END LOOP;

commit;

END;
Run Code Online (Sandbox Code Playgroud)

该数据库必须达到 99.99999%,而且我们每年只有 2 天的维护窗口。

我正在寻找一种更好的方法来删除这些记录,但我还没有找到。有什么建议?

oracle delete oracle-11g

19
推荐指数
2
解决办法
8万
查看次数

如何将 Oracle 数据库表卸载到 csv 文件中?

我需要从 Oracle 11g 第 1 版数据库中检索某些数据并将其作为一个或多个 CSV 文件提供。数据驻留在多个表和/或视图中。所有这些都应该通过命令行工作。什么是最好的方法?

oracle oracle-11g export command-line

18
推荐指数
2
解决办法
6万
查看次数

Oracle 11g 侦听器因 ORA-12514 和 ORA-12505 错误而失败

我在我的开发机器上本地运行了一个 Oracle 11g 实例,并且可以通过 SqlPlus 直接连接到本地实例:

c:\>sqlplus ace

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> select count(*) from my_table ;

  COUNT(*)
----------
      5297
Run Code Online (Sandbox Code Playgroud)

但我无法通过侦听器连接到它:

c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))"

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:52:40 2013 …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g listener

17
推荐指数
1
解决办法
9万
查看次数

SQL*Plus 的 Rem 和 -- 注释之间有什么区别吗?

在 SQL*Plus 提示符下,Rem和 都--可以作为注释指示符:

Rem this is a comment
-- this is also a comment
create table emp (
id number primary key,
name cvarchar2(40));
Run Code Online (Sandbox Code Playgroud)

这两种评论技术有什么区别吗?

oracle oracle-11g sqlplus

15
推荐指数
1
解决办法
3万
查看次数

在 Oracle 中,如何将 sequence.nextval 保存在变量中以在多个插入中重用?

我正在编写一个脚本来用数据填充一些表以进行测试。

我想写如下内容,但我不知道该怎么做(我是 Oracle 11g)

SET ENABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE
SET DISABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:ENABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :ENABLED_USER_ID);

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:DISABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :DISABLED_USER_ID);
Run Code Online (Sandbox Code Playgroud)

我知道我可以重新排列查询并使用sequence.currval引用,但我更喜欢将 id 保存在正确命名的变量中。

也许我应该将脚本包装在 a 中,DECLARE ... BEGIN ... END;但我希望有一种更简洁的方法来做到这一点。


2011 年 5 月 27 日 15:31

似乎无论如何我都必须在DECLARE块中声明变量。所以我正在尝试

DECLARE
  USER_ID NUMBER(10,0) := …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g

13
推荐指数
4
解决办法
5万
查看次数

如何在 listener.ora 中配置没有 SID_LIST_LISTENER 的 Oracle 侦听器?

我可以使用以下 listener.ora 访问 ORACLE 11g 服务器

# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它为该服务器上的所有实例提供服务,我可以通过以下方式验证

lsnrctl status
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在虚拟机中全新安装 Oracle 11g 时,我必须使用 listener.ora 之类的

# listener.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
      (PROGRAM = …
Run Code Online (Sandbox Code Playgroud)

oracle-11g listener

13
推荐指数
1
解决办法
14万
查看次数

LNNVL 理由

LNNVL 是一个内置函数的预言机,它在条件评估为 FALSE 或 UNKNOWN 时返回 TRUE,并在条件评估为 TRUE 时返回 FALSE。我的问题是返回与真值条件相反的值而不是仅处理 NULL 值有什么好处?

例如,假设您有一个 Emp 表,其中包含可能包含空值的 StartCommission 和 CurrentCommission 列。以下仅返回值都不为 null 的行:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Run Code Online (Sandbox Code Playgroud)

如果您想包含其中任何一个佣金为空的行,您可以执行以下操作:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission 
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Run Code Online (Sandbox Code Playgroud)

似乎存在一个函数来缩短此语法,但使用 LNNVL 会返回所有不相等的记录和所有具有空值的记录。

SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Run Code Online (Sandbox Code Playgroud)

添加 NOT 只返回没有空值的行。在我看来,这种情况下所需的功能是保持真条件为真,假条件为假,并使未知条件评估为真。我真的在这里创建了一个低用例吗?是否真的更可能想要将未知变为真、将真变为假、将假变为真?

create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 oracle-11g

12
推荐指数
2
解决办法
2248
查看次数

Oracle 数据库中的提交与快速提交与提交清除

我想知道是否有人可以验证我对这 3 个与 Oracle 数据库相关的术语之间差异的理解。

许多来源混淆了这些术语并且没有详细解释它们,因此查找信息有点困难。

从我收集到的:

  1. 提交和快速提交是一回事,所有提交都是快速提交。
  2. 快速提交本质上仅更新撤消/回滚段标头的事务表中的标志以指示事务已提交。然而,实际块没有被重新访问,这意味着位于数据块头部的感兴趣事务列表(ITL)中的撤消字节地址(UBA)仍然指向相应撤消段的事务表。此外,相应行的锁字节不会被释放,并且 ITL 中的锁计数不变(行仍然被锁定)。
  3. 在一个提交清除,块重新与ITL与提交SCN更新。然而,ITL 中的锁计数和每行存储的锁字节仍然没有更新(行仍然被锁定,就像在快速提交中一样),即使块被更改,这也不会生成重做。
  4. 正常提交的块(== 快速提交)将在下次触摸时进行延迟块清除(并生成重做)。
  5. 进行了提交清除的块将在下次触摸时进行延迟日志记录块清除(并生成重做)。

希望有人可以验证这些要点!谢谢!

rdbms oracle oracle-11g-r2 oracle-11g oracle-10g

12
推荐指数
1
解决办法
4657
查看次数