我有一个 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 Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit
是否有一种简单快捷的方法来更改服务器上测试数据库的 SID?
删除和重新创建数据库对我来说是一个选择。但我正在寻找需要更少时间的东西。
在客户端 tnsnames.ora 中分配名称的另一个选项容易出错,因为它们不是集中管理的。
与在 SQL-Server 上删除和创建数据库的时间相比,创建新的 Oracle 数据库所需的时间要多得多。进一步在 SQL-Server 上,您可以重命名 SQL-Server 实例。[通常您重命名运行 SQL-Server 的服务器并且在重命名服务器之前会遇到一些问题]。
我管理一个应用程序,它有一个非常大的(近 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 11g 第 1 版数据库中检索某些数据并将其作为一个或多个 CSV 文件提供。数据驻留在多个表和/或视图中。所有这些都应该通过命令行工作。什么是最好的方法?
我在我的开发机器上本地运行了一个 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) 在 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 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;但我希望有一种更简洁的方法来做到这一点。
似乎无论如何我都必须在DECLARE块中声明变量。所以我正在尝试
DECLARE
USER_ID NUMBER(10,0) := …Run Code Online (Sandbox Code Playgroud) 我可以使用以下 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) 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) 我想知道是否有人可以验证我对这 3 个与 Oracle 数据库相关的术语之间差异的理解。
许多来源混淆了这些术语并且没有详细解释它们,因此查找信息有点困难。
从我收集到的:
希望有人可以验证这些要点!谢谢!
oracle-11g ×10
oracle ×9
listener ×2
command-line ×1
delete ×1
export ×1
linux ×1
oracle-10g ×1
pivot ×1
rdbms ×1
sqlplus ×1