问题
我正在尝试理解Oracle SQL命令CALL与之间的区别EXECUTE.
我一直在用它CALL来启动存储过程,但在与另一个开发人员交谈时,我发现他几乎只使用了EXECUTE.我在网上做了一些研究,看看我是不是做错了什么但是我没有看到两个命令之间的明显区别,人们似乎可以互换使用它们.
根据文档,它们看起来非常相似(至少在与存储过程交互方面).
它看起来像是CALL一个通用的SQL命令,虽然EXECUTE似乎是专有的,所以我倾向于使用CALL,EXECUTE但后来我不知道这对性能有什么意义.
问题
问题
我需要更好地理解有关何时可以在子查询中引用外部表以及何时(以及为什么)这是不合适的请求的规则.我在Oracle SQL查询中发现了一个重复,我正在尝试重构,但是当我尝试将我的引用表转换为分组子查询时,我遇到了问题.
以下声明适用:
SELECT t1.*
FROM table1 t1,
INNER JOIN table2 t2
on t1.id = t2.id
and t2.date = (SELECT max(date)
FROM table2
WHERE id = t1.id) --This subquery has access to t1
Run Code Online (Sandbox Code Playgroud)
不幸的是,table2有时会有重复的记录,所以在将它加入t1之前我需要首先聚合t2.但是,当我尝试将其包装在子查询中以完成此操作时,SQL引擎突然无法再识别外部表.
SELECT t1.*
FROM table1 t1,
INNER JOIN (SELECT *
FROM table2 t2
WHERE t1.id = t2.id --This loses access to t1
and t2.date = (SELECT max(date)
FROM table2
WHERE id = t1.id)) sub on t1.id = sub.id
--Subquery loses access to t1
Run Code Online (Sandbox Code Playgroud)
我知道这些是根本不同的查询,我要求编译器放在一起,但我不知道为什么一个会工作而不是另一个.
我知道我可以复制子查询中的表引用,并有效地将子查询从外部表中分离,但这似乎是完成此任务的一种非常难看的方式(所有代码和处理的重复都是如此).
有用的参考资料 …
我知道内部类可以访问外部类中的所有内容(因为它是该类的成员)但是反过来呢?
外部类是否可以访问内部类中的私有变量和方法?
我看过文章提到内部类应该是私有的,这样它们只能被外部类访问.这对内部类的可访问性有什么影响?
在内部类中处理访问级别的最佳实践是什么?我假设更多的封装更好,但这是以牺牲可访问性为代价的吗?
问题
我试图理解为什么在这两个Oracle语法更新查询中看起来微不足道的原因导致执行计划完全不同.
查询1:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select *
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
查询2:
UPDATE sales s
SET status = 'DONE', trandate = sysdate
WHERE EXISTS (Select rownum
FROM tempTable tmp
WHERE s.key1 = tmp.key1
AND s.key2 = tmp.key2
AND s.key3 = tmp.key3)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两者之间的唯一区别是查询2中的子查询返回rownum而不是每行的值.
这两者的执行计划不可能更加不同:
Query1 - 从两个表中提取总结果,并使用sort和hashjoin返回结果.这有利于2,346的成本(尽管使用了EXISTS条款和有凝聚力的子查询).
Query2 - 同时拉取两个表结果,但使用计数和过滤器来完成相同的任务,并以惊人的77,789,696成本返回执行计划!我应该注意到他的查询只是挂在我身上所以我实际上并不是肯定的,这会返回相同的结果(尽管我相信它应该).
根据我对Exists子句的理解,它只是一个简单的布尔检查,它运行在主表的每一行.如果在我的EXISTS条件中返回单行或100,000行也没关系...如果为正在运行的行返回任何结果,那么您已经通过了存在检查.那么为什么我的子查询SELECT语句返回的重要性呢?
- - - - - - - - - …
在制作小型测试表的过程中,我偶然发现了以下在线文章:(http://www.techonthenet.com/sql/insert.php),它提供了有关如何在Oracle中插入多行固定值的以下解决方案:
Insert All
Into testTable (key, field1, field2) Values (1, 10, 'a')
Into testTable (key, field1, field2) Values (2, 20, 'b')
Into testTable (key, field1, field2) Values (3, 30, 'c')
Into testTable (key, field1, field2) Values (4, 40, 'd')
Select * from dual;
Run Code Online (Sandbox Code Playgroud)
双重的使用是我以前从未见过的,所以我开始做一些研究,以了解它是如何工作的.我知道这个表是针对某些oracle语法的解决方法,但它如何完成这些任务仍然没有为我点击.我知道其他人已经问了一个类似的问题(Oracle SELECT FROM如何使用多个字段进行双重工作)但我还没有看到任何人解释实际情况.
这是一个参考技巧,他们能够使用单值表来实现,或者Oracle中的某些函数只是硬编码,当他们看到双表时会采取不同的行为吗?
更具体地说,引用它如何允许上面的代码基本上循环遍历多个Into ... Values ...语句?
有人可以向我解释一下吗?
我第一次在学校项目中使用泛型,我遇到了一个关于是否在我的方法中返回对象或我声明的泛型元素的哲学困境.
我的OCD告诉我,我需要始终返回已知的类型,但我发现当我将原始数据类型提供给我的类时,这样做会产生一些下游烦恼(当然,对于这个项目,我只会提供原语进入这个班).
这是我的意思的一个例子:
public class DansPriorityQueue<E extends Comparable>
{
private ArrayList<E> tree;
//Here's a method that returns an object
public Object peek() {
return tree.get(0);
}
//Here's a method that returns the generic type
public E peek() {
return tree.get(0);
}
Run Code Online (Sandbox Code Playgroud)
(作为一个FYI ..我需要自己实现这个JDK类,但幸运的是我不需要实现真正的PriorityQueue所做的相同接口,所以我可以选择是否要使用Object或者泛型)
我的问题
它让我觉得有点脏,但我很想在这些方法上返回一个Object而不是我的E泛型元素,因为当我返回E时,JUnit强制我强制转换整数值:
DansPriorityQueue<Integer> dpq = new DansPriorityQueue<Integer>();
dpq.add(1);
assertEquals("Expected different value", (Integer) 1, dpq.peek());
Run Code Online (Sandbox Code Playgroud)
另一方面,当我返回一个对象时,自动装箱不会强迫我施放原始值.
以下是我所面临的问题的更有说服力的描述:
- - - - - - 编辑 - - - - - - - -
这是我返回泛型类型并使用自动装箱的Integer对象填充我的列表而没有上面的强制转换时收到的实际错误:方法assertEquals(String,Object,Object)对于DansPriorityQueueTest类型是不明确的
---------结束编辑--------------
问题 …
问题
我试图了解Sun如何实现HashMap类的entrySet,keySet和values方法,但我遇到的代码对我来说没有意义.
我从概念上理解这些方法返回的视图直接链接到HashMap中的map.entry列表,并且它们使用自己的迭代器(引用中央HashMap迭代器)来完成大部分工作.我的问题在于理解这些视图究竟是如何被实例化的(因为它们不是副本,而是位于实际HashMap列表之上的东西).
参考
我正在查看本网站上的源代码:http://developer.classpath.org/doc/java/util/HashMap-source.html
这是给我带来麻烦的一个片段:
157: private transient Set<Map.Entry<K, V>> entries;
594: public Set<Map.Entry<K, V>> entrySet()
595: {
596: if (entries == null)
597: // Create an AbstractSet with custom implementations of those methods
598: // that can be overridden easily and efficiently.
599: entries = new AbstractSet<Map.Entry<K, V>>()
600: {
601: public int size()
602: {
603: return size;
604: }
605:
606: public Iterator<Map.Entry<K, V>> iterator()
607: {
608: // Cannot create the iterator …Run Code Online (Sandbox Code Playgroud) 所以我知道这是一个非常基本的问题,但我很难在Google,Wiki或Oracle上找到答案.(我看到的每个技术文档都假设已经理解了这些主题)
我正在阅读一篇关于Oracle Optimizer错综复杂的文章,以及Explain Plan如何确定最便宜的SQL查询计划.现在我在对不同的接入方式(如部分全索引扫描和快速全索引扫描),我不断看到引用单段与多嵌段 I/O读取.
我以前见过这些概念,但我只是模糊地理解它与Oracle引擎如何访问存储在块上的数据有关.
问题
我是SQL Server和DBMS的新手,我在以下查询中遇到了一些问题:查询名为:MaliciousCodeAlertDocument的表的单个记录
这是我的查询:
UPDATE MaliciousCodeAlertDocument
SET Discovered = GetDate(),
LastUpdated = GetDate(),
SourceId = "UP",
MalCodeID = 1,
Title = "UPDATED",
Origin = "UP",
Type = "UP",
Feature = "UP",
Risk = "UP",
Severity = 1,
OverallImpact = 1,
ContagionPotential = 1,
Wild = "UP",
AlertStatusID = 1,
AttributeType = 1,
DetailLevel = 1 ,
Language = 1 ,
Summary = "UP" ,
Symptom = "UP" ,
TechnicalDescription = "UP" ,
MitigatingStrategy = "UP" ,
Disinfection = "UP" …Run Code Online (Sandbox Code Playgroud) 我刚刚找到一个问题的答案,我遇到的问题是PL/SQL变量没有被函数识别,我希望有人可以向我解释为什么我的解决方案有效以及发生了什么"在幕后".
背景
作为优化项目的一部分,我正在尝试收集存储过程中各个SQL脚本的度量标准.我正在解析的存储过程具有一个In-type日期参数,我需要定义它以运行每个单独的SQL脚本:
CREATE OR REPLACE myStoredProc (DATE_IN DATE, ERROR_OUT OUT VARCHAR2)
IS
BEGIN
--Truncate Temp Tables
--6 Individual SQL Scripts
EXCEPTION
--Error Handling
END;
Run Code Online (Sandbox Code Playgroud)
为了单独运行每个脚本,我决定将每个SQL语句放入PL/SQL块并将DATE_IN参数作为变量提供:
DECLARE
DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR');
BEGIN
--Place individual script here
END;
Run Code Online (Sandbox Code Playgroud)
问题
这种方法适用于引用此DATE_IN变量的几个查询,但是一个查询引用了外部函数,该函数DATE_IN作为参数开始抛出ORA-00904错误:
DECLARE
DATE_IN DATE := TO_DATE('16-JUL-2014','DD-MON-RR');
BEGIN
insert into temp_table
SELECT table1.field1,
table1.field2,
table2.fieldA,
MyFunction(table1.field1, DATE_IN) --This was the problem line
FROM
table1,
table2
WHERE EXISTS (inner query)
AND table1.keys = table2.keys
AND table2.date <= DATE_IN …Run Code Online (Sandbox Code Playgroud)