使用BETWEEN子句或使用<= AND> =比较之间是否存在性能差异?
即这两个查询:
SELECT *
FROM table
WHERE year BETWEEN '2005' AND '2010';
Run Code Online (Sandbox Code Playgroud)
...和
SELECT *
FROM table
WHERE year >= '2005' AND year <= '2010';
Run Code Online (Sandbox Code Playgroud)
在此示例中,year列是VARCHAR2(4),其上有索引.
我最近将我的开发机器从Windows XP升级到Windows 7.如何判断哪个w3wp.exe进程属于运行Windows 7的桌面上的哪个App Pool?
但是我的桌面呢?
我有一个Oracle存储过程,它已在本地开发实例和运行Oracle 8,然后是9,然后是10和最近11的多个客户端测试和生产实例上运行了大约7年.它一直工作直到升级到Oracle 11g.基本上,该过程打开引用游标,更新表然后完成.在10g中,光标将包含预期的结果,但在11g中,光标将为空.升级到11g后没有更改DML或DDL.这种行为在我尝试过的每10g或11g实例上都是一致的(10.2.0.3,10.2.0.4,11.1.0.7,11.2.0.1 - 所有在Windows上运行).
具体的代码要复杂得多,但要用一些现实的概述来解释这个问题:我在头表中有一些数据,还有一堆子表将输出到PDF.头表有一个布尔值(NUMBER(1),其中0表示false,1表示为真)列表示该数据是否已被处理.
视图仅限于显示尚未处理的行(视图还连接到其他一些表,进行一些内联查询和函数调用等).因此,在打开游标时,视图显示一行或多行,然后在游标打开后运行update语句以翻转头表中的标志,发出提交,然后过程完成.
在10g上,游标打开,它包含行,然后update语句翻转标志并再次运行该过程将不产生任何数据.
在11g上,游标永远不会包含该行,就好像在更新语句运行之后光标才会打开.
我担心可能会影响其他程序和其他应用程序的11g(希望是可配置的设置)中的某些内容可能已发生变化.我想知道的是,是否有人知道为什么两个数据库版本之间的行为不同,以及是否可以在没有代码更改的情况下解决问题.
更新1:我设法将问题跟踪到一个独特的约束.似乎当11g中存在唯一约束时,无论我是否针对实际对象运行真实世界代码或以下简单示例,该问题在100%的时间内都是可再现的.
更新2:我能够从等式中完全消除视图.我已经更新了简单的示例,以便即使在直接查询表时也存在问题.
CREATE TABLE tbl1
(
col1 VARCHAR2(10),
col2 NUMBER(1)
);
INSERT INTO tbl1 (col1, col2) VALUES ('TEST1', 0);
/* View is no longer required to demonstrate the problem
CREATE OR REPLACE VIEW vw1 (col1, col2)
AS
SELECT col1, col2
FROM tbl1
WHERE col2 = 0;
*/
CREATE OR REPLACE PACKAGE pkg1
AS
TYPE refWEB_CURSOR IS REF CURSOR;
PROCEDURE proc1 (crs OUT refWEB_CURSOR);
END …
Run Code Online (Sandbox Code Playgroud) 我正在将PDF流式传输到ASP.NET 2.0中的浏览器.这适用于所有浏览器,通过HTTP和所有浏览器,除了通过HTTPS的IE.据我所知,这曾经在所有版本的IE中工作(过去5年左右),但我们的客户最近才开始报告问题.我怀疑默认情况下禁止将加密页面保存到磁盘安全选项,并且在某些时候默认启用(Internet选项 - >高级 - >安全性).关闭此选项有助于作为解决方案,但作为长期解决方案不可行.
我收到的错误消息是:
Internet Explorer无法从www.sitename.com下载OutputReport.aspx.
Internet Explorer无法打开此Internet站点.请求的网站不可用或无法找到.请稍后再试.
用于创建PDF的工具是DataDynamics的 ActiveReports .创建PDF后,下面是发送它的代码:
Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()
Run Code Online (Sandbox Code Playgroud)
注意:如果我没有明确指定缓存控制,那么.NET代表我发送no-cache,所以我尝试将cache-control设置为:private或public或maxage =#,但这些似乎都不起作用.
这是扭曲:当我运行Fiddler检查响应头时,一切正常.我收到的标题是:
HTTP/1.1 200 OK
缓存控制:max-age = 1
日期:2009年7月29日星期三17:57:58 GMT
内容类型:application/pdf
服务器:Microsoft-IIS/6.0
MicrosoftOfficeWebServer:5.0_Pub
X-Powered-By :ASP.NET
X-AspNet-Version:2.0.50727
content-disposition:attachment; filename = statement.pdf
Content-Encoding:gzip
Vary:Accept-Encoding
Transfer-Encoding:chunked
一旦我关闭Fiddler并再次尝试,它就会再次失败.我注意到的另一件事是,当Fiddler正在运行时,我得到一个这个网站的安全证书警告消息有问题,我必须点击继续到这个网站(不推荐)才能通过.当Fiddler关闭时,我没有遇到此安全警告,它立即失败.
我很好奇Fiddler和浏览器之间发生了什么,以便它在Fiddler运行时运行但在不运行时会中断,但更重要的是,是否有人有任何想法如何更改我的代码以便将PDF流式传输到IE而无需进行更改到客户端机器?
更新: Fiddler问题得到解决,非常感谢EricLaw,所以现在它的行为始终如一(破坏,有或没有Fiddler运行).
基于谷歌搜索,似乎有大量关于同一问题的报告遍布整个网络,每个报告都有自己特定的响应标题组合,似乎可以解决各个案例的问题.我已经尝试了很多这些建议,包括添加ETag,LastModified日期,删除Vary标头(使用Fiddler)以及Cache-Control和/或Pragma标头的几十种组合.我尝试了ContentType的"Content-Transfer-Encoding:binary"以及"application/force-download".到目前为止,没有任何帮助.有一些 Microsoft 知识库 文章,所有这些都表明Cache-Control:no-cache是罪魁祸首.还有其他想法吗?
更新:顺便说一句,为了完整性,Excel和Word输出也会出现同样的问题.
更新:没有取得任何进展.我通过电子邮件将.SAZ文件从Fiddler发送给EricLaw,他在调试IE时能够重现这个问题,但还没有解决方案.赏金即将到期......
我现在正在学习PL/SQL,目前使用oracle HR模式处理过程和异常.
这是我的简单程序.
create or replace
PROCEDURE DEL_JOB
(p_jobid jobs.job_id%TYPE)
AS
sqle NUMBER;
sqlm VARCHAR2(300);
BEGIN
DELETE FROM JOBS
WHERE JOB_ID = UPPER(p_jobid);
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No such record');
END IF;
EXCEPTION
WHEN OTHERS THEN
sqle := SQLCODE;
sqlm := SQLERRM;
DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted');
DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm);
END;
Run Code Online (Sandbox Code Playgroud)
当我执行此过程时,输出为
No such record
PL/SQL procedure successfully complete.
Run Code Online (Sandbox Code Playgroud)
但是,根据Oracle PDF,它应该抛出一个异常,我应该得到我在异常中输入的消息.
同样的事情发生在非现有记录上的更新.请指教.谢谢
For Each Dr As DataRow In InvoiceDT.Rows
Dim DrResult As Array = PaymentInvoiceDT.Select("Amount='" & Dr("Amount").ToString() & "'")
If DrResult.Length > 0 Then
''some code
Else
InvoiceDT.Rows.remove(Dr)
End If
Next
Run Code Online (Sandbox Code Playgroud)
它给出了错误,因为当您在datatable中更改某些内容时,其索引会发生更改.
为什么这个SQL查询有效:
SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)NEXT_DAY(SYSDATE,7) ------------------- 01-APR-17 1 row selected.
...但是这个匿名的PL/SQL块不起作用?
DECLARE
dteExpires DATE;
BEGIN
dteExpires := NEXT_DAY(SYSDATE, 7);
END;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)Error at line 1 ORA-01846: not a valid day of the week ORA-06512: at line 4
我不想将第二个参数硬编码为前一天的英文名称.NEXT_DAY(SYSDATE, 'SATURDAY')
或NEXT_DAY(SYSDATE, 'SUNDAY')
等.
现在,我将使用以下方法,但我真的想知道为什么NEXT_DAY()
PL/SQL中的行为与SQL中的行为不同.
DECLARE
dteExpires DATE;
BEGIN
-- 2017-01-01 = SUNDAY
dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 'DAY'));
END;
Run Code Online (Sandbox Code Playgroud)
这是我的DEV环境:
SELECT *
FROM v$version;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)BANNER -------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production …
我有一个psql脚本,如下所示:
-- first set of statements
begin
sql statement;
sql statement;
sql statement;
exception
when others then
rollback
write some output
(here I want to exit the entire script and not continue on to the next set of statements)
end
/
-- another set of statements
begin
sql statement;
sql statement;
sql statement;
exception
when others then
rollback
write some output
(here I want to exit the entire script and not continue)
end
/
... and so on
Run Code Online (Sandbox Code Playgroud)
是否可以退出脚本并停止处理脚本的其余部分?
我有一个以foobar
列name
和列命名的表location
.我想用SQL来获取去过纽约但没去过旧金山的所有人的名字.
到目前为止:
select name
from foobar
where location = "New York" and location != "San Francisco"
group by name
Run Code Online (Sandbox Code Playgroud) 我正在编写触发器,但遇到了一些问题。触发器执行并编译没有错误,但是由于某些原因,它没有完成我想要的工作。如果有人可以帮助我。
这是问题:
编写要在插入,更新属性时执行的触发器。输入的每个属性都将与其他具有相同属性的属性进行检查:代理,所有者,地址,如果找到一个,则将属性状态更新为“双重”。
我要插入相同的数据,但我可以这样做,但通常不会!
这是我的桌子:
create table Properties(
idProperties number(10) NOT NULL,
Type varchar2(45) NOT NULL,
SquareMeters varchar2(10) NOT NULL,
Rooms number(10) NOT NULL,
ConstructionDate date NOT NULL,
FloorLocation varchar(20),
Price number(10) NOT NULL,
CityView varchar2(20),
DateOfInsert date NOT NULL,
DateOfExiration date NOT NULL,
Address_FK number(20),
Service_FK number(20),
Ownership_FK number(20),
Status_FK number(20),
PropertyService_FK number(20))
create table Address(
idAddress number(10) NOT NULL,
address_name varchar2(20),
City_FK number(20))
create table OwnerAgent(
idOwnerAgent number(10) NOT NULL,
Name varchar2(50) NOT NULL,
LastName varchar2(50) NOT NULL, …
Run Code Online (Sandbox Code Playgroud)