Questions tagged «oracle»

所有版本的Oracle数据库。如果该上下文在问题中很重要,请添加特定于版本的标记,例如oracle-11g-r2。请勿用于Oracle产品(例如应用程序或中间件)或Oracle拥有的其他数据库产品(例如MySQL或BerkeleyDB)。

5
对于大型应用程序,在同一个数据库的不同模式的表上创建外键是个坏主意吗?
我正在将基于pl / sql网络的大型应用程序传输到专用服务器。此应用程序位于具有70个程序包代码的模式中。在不同的时间大约有15个人进行了此应用程序。对我们来说,通常的做法是在不同模式的引用表上创建外键,因为它确实很方便并且可以使数据库保持整洁,因为我们不需要在不同的模式中保留相同的引用表。 但是无论如何,我的DBA(使用DB创建新实例并在Solaris区域内复制我的应用程序)今天非常苛刻,“不同模式上的外键是邪恶的,您需要销毁它!”。他没有解释他的观点。 在大型应用程序上这样做真的是个坏主意吗?

5
在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', …


5
更新所有行
我想知道以最有效的方式针对单个列更新超大型Oracle表中的每一行。例如: update mytable set mycolumn=null; 要么: update mytable set mycolumn=42; 我的知识可能很过时。我要做的是更改表以删除列。然后,我更改表以添加具有我要使用的新值的默认值的列。然后,我更改表以删除该列的默认值。我发现这比运行更新要快得多,但是我觉得有更好的方法。
12 oracle  update 


3
有没有办法打破字符串并注入SQL,而无需在oracle中使用单引号?
我正在测试基于oracle的应用程序,并且发现以下代码: Query =“从雇员那里选择名称,其中id ='” + PKID +“';;” 即查询字符串包含直接从URL获得的PKID值周围的引号。 显然,这是一个经典的SQL注入等待中……除非应用程序位于CA SiteMinder后面,否则它将阻止任何带有单引号(任何形式)的URL传递给应用程序。 有没有办法打破字符串并注入SQL而无需使用单引号? 编辑:抱歉,我应该更清楚-我知道应该如何编写,但是我需要说服人们这是一个可利用的问题。目前,由于它落后于siteminder,后者阻止了单引号,因此这将是低优先级的解决方案。

1
Oracle数据库中的提交与快速提交与提交清除
我想知道是否有人可以验证我对这三个术语与Oracle数据库之间的区别的理解。 许多消息来源混淆了这些术语,并且没有详细解释它们,因此查找信息有些困难。 从我的收集: 提交和快速提交是完全一样的东西,所有提交都是快速提交。 快速提交实质上仅更新撤消/回滚段头的事务表中的标志,以指示事务已提交。但是,实际块未重新访问,这意味着位于数据块头中的感兴趣的事务列表(ITL)中的撤消字节地址(UBA)仍指向相应撤消段的事务表。此外,不释放相应行的锁定字节,并且ITL中的锁定计数不变(行仍被锁定)。 在提交清除中,将重新访问该块,并使用提交SCN更新ITL。但是,ITL中的锁计数和每行存储的锁字节仍未更新(行仍然像快速提交中一样被锁),即使更改了块也不会生成重做。 正常提交(==快速提交)的块将在下次触摸(并生成重做)时进行延迟块清除。 进行了提交清除的块将在下次被触摸(并生成重做)时进行延迟日志记录块清除。 希望有人可以验证这些观点!谢谢!

4
为何在Oracle中不使用可为空的数字?
我们的公司正在与另一个软件公司进行联合项目,有人告诉我们,如果不应显示特定值,则应传递-5000(它们的任意哨兵值);原因是在Oracle数据库(现在是以前的Oracle开发人员)的建议下,Oracle数据库中没有number列支持空值。该公司还用VB6编写了他们的绝大多数代码(慢慢地过渡到VB.NET,这是另一天的话题...)。出于纯粹的好奇心,此建议是否有任何正当理由?我想不起我这边。 -编辑 感谢您的反馈。我在CodeProject.com(链接)上提出了相同的问题,并收到了非常相似的反馈。似乎唯一可以证明这种做法正确的时间与外键有关,我可以说它们在系统中的任何地方都不使用外键。做出此决定的开发人员(我曾经在该公司工作)比我拥有更多的经验,因此我想确保在发生嘲笑之前没有正当的理由。

1
在JDBC中禁用显式提交,在SQL中检测它们,或将数据库置于只读状态
背景:我正在http://sqlfiddle.com(我的网站)上工作,并试图防止可能的一种滥用途径。我希望通过询问我当前要解决的问题,我不会无意间使潜在的虐待更为严重,但是您能做什么?我相信你们。 我想防止任何用户在给定的交易块内发出明确的“提交”调用。从SQL Fiddle的上下文来看,事务块是在右侧面板上执行的代码。基本上,我遍历并执行一系列明文SQL命令,并且我想确保它们所做的所有更改都将在批处理结束时回滚。通常,它们的更改会回滚,但是有时文本中会包含明确的“ commit”语句,因此我的回滚当然是行不通的。用户试图破坏SQL Fiddle上的架构时,很可能发生这种显式提交,因此其他从事此操作的人将看到错误。 主要期望结果:如果可能,我想在JDBC级别禁用显式提交。这是因为我必须支持多个数据库后端供应商,并且当然每个供应商都有其低级的怪癖。 Fallback选项:如果无法将JDBC配置为禁用显式提交,那么我将接受在处理以下每个后端批处理时检测显式提交的解决方案:SQL Server,Oracle,MySQL和PostgreSQL。 对于SQL Server,我想到了这种解决方案:在执行该语句之前,先解析XML查询计划中的语句,然后检查是否存在与该XPath相匹配的条目: //*[@StatementType="COMMIT TRANSACTION"] 我认为这对于SQL Server来说会很好。但是,这种方法不适用于其他数据库类型。Oracle针对显式提交的XML执行计划输出未引用您正在运行commit语句的事实(而只是重复从其提交的查询中重复执行计划输出)。PostgreSQL和MySQL根本不为显式提交提供任何执行计划输出(XML或其他方式)。 剩下的工作就是检查“ commit”一词的实际陈述。这将起作用,除非可能存在各种变化: declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上面是SQL Server的示例(我可以解决),但是我想Oracle,MySQL和PostgreSQL可能会发生类似的事情。我在这个假设上错了吗?也许他们不允许“动态”提交语句?随意使用SQL Fiddle(最好不要使用示例架构或可能正在使用的其他示例)来查看是否可以在Oracle,MySQL和PostgreSQL中进行类似的操作。如果没有,也许简单的字符串检测可能适用于那些。 还有另一种可能性 我想到了另一个选择-如果您知道一种将这些数据库中的任何一个设置为只读模式的方法,例如在该模式下,什么也不能提交,那也可以工作。只要在该模式下什么也不能提交,我就仍然需要允许启动事务并在其中运行代码。那可能吗? 更新资料 我最近学到的-PostgreSQL实际上不是问题。显然,如果同一交易块最终被回滚(在Postgres中),则该交易块中发出的提交将不适用。所以为Postgres致敬! 多亏了Phil在SO帖子上的链接,我想我可以使用DEFERRABLE INITIALIALLY DEFERRED hack for Oracle来完成我要执行的操作(如果发出了提交,将会引发错误,但是我可以解决这个问题)。这应该针对Oracle。(我想了一会儿嵌套事务可能在这里工作,但是Oracle似乎不支持嵌套事务?无论如何,我找不到以这种方式工作的任何东西)。 真的还没有针对MySQL的解决方案。使用嵌套事务进行了尝试,但这似乎不起作用。我正在认真考虑MySQL的更严格的方法,例如不允许在右侧使用SELECT或在每次查询后删除/重新创建数据库。听起来都不好。 解析度 因此,我现在已经为SQL Server和Oracle实现了所描述的解决方案,并且正如我提到的那样,对于PostgreSQL来说这实际上不是问题。对于MySQL,我采取了一些不幸的步骤,将查询面板限制为仅选择语句。仅需在架构面板(左侧)上输入用于MySQL的DDL和DML。我希望这不会破坏太多的旧提琴,但是我认为这只是确保数据一致性所要做的。谢谢!

2
对多个查询列使用相同的CASE WHEN条件
是否存在一种“更好”的方式来重写SELECT子句,其中多个列使用相同的CASE WHEN条件,以便仅检查条件一次? 请参见下面的示例。 SELECT CASE testStatus WHEN 'A' THEN 'Authorized' WHEN 'C' THEN 'Completed' WHEN 'P' THEN 'In Progress' WHEN 'X' THEN 'Cancelled' END AS Status, CASE testStatus WHEN 'A' THEN authTime WHEN 'C' THEN cmplTime WHEN 'P' THEN strtTime WHEN 'X' THEN cancTime END AS lastEventTime, CASE testStatus WHEN …

3
Oracle如何知道我是谁?
一点都不重要,但这激起了我的好奇心。 我刚刚使用Oracle SQL Developer工具首次登录了Oracle 10g数据库。 我使用了一个非我的名字(nottstest2)的通用用户登录名,该用户名来自一台不是我的名字(小胡瓜)的机器。我的名字在数据库中不存在,并且与登录名无关。 但是,服务器日志显示来自“乔恩·霍普金斯”的连接。 它怎么知道我是谁?它是否以某种方式从我的Windows登录名中被拉出(尽管我没有使用单一登录)?

3
什么是密钥保存表概念?
我在Oracle文档中的“更新联接视图”部分中阅读了有关键保留表的信息。 但是,我没有找到任何简单的方法来理解它。 我希望收到除Oracle官方文档以外的一些简单概念上的详细信息。
12 oracle 

2
突变表错误的原因和解决方案是什么?
我了解突变表错误是由设计缺陷或有问题的查询引起的。 最近将一个旧查询投入生产,该查询引发了变异表错误。我们的DBA解决了问题,但我们不知道如何解决。 究竟是什么导致表突变错误?我们的DBA如何解决该问题?
12 oracle  trigger  plsql 

2
将7亿行更新为相同的值
我有一个数据仓库(oracle),在这里我需要为所有7亿行的列设置相同的值。 我没有管理员权限,也没有管理员权限,因此需要使用基本sql来完成,并且不会创建临时表。 更复杂的问题是,如果我尝试仅执行一个简单的更新(其中1 = 1),则它会耗尽重做空间。 我现在运行它的方式是这样的循环: loop update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000; commit; end loop 但是我知道这可能很幼稚,必须有一个更快,更优雅的解决方案。

2
LNNVL证明
LNNVL是一个Oracle内置函数,对于评估为FALSE或UNKNOWN的条件返回TRUE,对于评估为TRUE的条件返回FALSE。我的问题是,返回真值条件的对立而不只是处理NULL值有什么好处? 例如,假设您有一个包含StartCommission和CurrentCommission列的Emp表,其中的列可能包含空值。以下仅返回两个都不为null的行: SELECT * FROM Emp WHERE StartCommission = CurrentCommission; 如果要包括其中任一佣金为null的行,则可以执行以下操作: SELECT * FROM Emp WHERE StartCommission = CurrentCommission OR StartCommission IS NULL OR CurrentCommission IS NULL; 似乎存在一个可以缩短此语法的函数,但是使用LNNVL会返回所有非相等记录以及所有具有空值的记录。 SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission); 向其添加NOT只会返回不包含null的行。在我看来,这种情况下所需的功能是保持真实条件为真,错误条件为假以及未知条件为真。我真的在这里创建了一个低用例吗?是否真的更有可能想要将未知变成真实,将真实变成虚假,以及将虚假变成真实? create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2)); insert into emp values (null,null); insert …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.