有时,我在Windows上的Oracle数据库会受到冲击.如何手动卸载Oracle?
在MS SQL Server中,如果我想检查存储过程的结果,我可能会在Management Studio中执行以下操作.
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
Run Code Online (Sandbox Code Playgroud)
结果窗格中的输出可能如下所示.
ID Title ViewCount Votes
----- ------------------------------------------------- ---------- --------
2165 Indexed View vs Indexes on Table 491 2
5068 SQL Server equivalent to Oracle’s NULLS FIRST 524 3
1261 Benefits Of Using SQL Ordinal Position Notation? 377 2
(3 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
无需编写循环或PRINT语句.
要在Oracle中执行相同的操作,我可能会在SQL Developer中执行以下匿名块
--ORACLE WAY
DECLARE
OUTPUT MYPACKAGE.refcur_question;
R_OUTPUT MYPACKAGE.r_question;
USER VARCHAR2(20);
BEGIN
dbms_output.enable(10000000);
USER:= 'OMG Ponies';
recordCount := 0;
MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,
p_USER=> USER,
) ;
DBMS_OUTPUT.PUT_LINE('ID | …Run Code Online (Sandbox Code Playgroud) 在Oracle 10g中,我DATE在表中使用type 时遇到了问题.我只是想要我的DATE田间商店,DATE没有时间自动.
有这么多的解决方案,我知道它就像使用TO_CHAR和/ TO_DATE或者TRUNC我面对的是我使用如此多的程序来插入或更新数据并且没有时间更新所有这些.
我怎么能解决这个问题?
我有一张如下表
ID created sent type
-----------------------------------------------------
0001463583000051783 31-JUL-12 1 270
0081289563000051788 01-AUG-12 1 270
0081289563000051792 01-AUG-12 1 270
0081289563000051791 01-AUG-12 1 270
0081289563000051806 01-AUG-12 1 270
0001421999000051824 06-AUG-12 1 270
0001421999000051826 06-AUG-12 1 270
0001464485000051828 06-AUG-12 1 270
0082162128000051862 09-AUG-12 2 278
0082162128000051861 09-AUG-12 2 278
0022409222082910259 09-AUG-12 3 278
Run Code Online (Sandbox Code Playgroud)
我想要输出以下内容
created Count
---------------------
31-JUL-12 1
01-AUG-12 4
06-AUG-12 3
09-AUG-12 3
Run Code Online (Sandbox Code Playgroud)
在Oracle 10g上使用SQL Developer实现这一目标有多难
我已经尝试了几个查询来生成这样一个表,最后它没有按日期对计数进行分组,当我们每天平均5000-10000个事务时,只给我一个'1'计数.我可能过于复杂了.但我想要一些简单的事情,我可以在日期范围内每天提取交易量.
当我运行查询时,目前发生的事情是
created Count
---------------------
31-JUL-12 1
01-AUG-12 1
01-AUG-12 1
01-AUG-12 1
01-AUG-12 1 …Run Code Online (Sandbox Code Playgroud) 我正在使用Oracle 10g和以下范例来获取15个结果的页面(因此当用户查看搜索结果的第2页时,他们会看到记录16-30).
select *
from
( select rownum rnum, a.*
from (my_query) a
where rownum <= 30 )
where rnum > 15;
Run Code Online (Sandbox Code Playgroud)
现在我必须运行一个单独的SQL语句来对"my_query"执行"select count"以获取my_query的结果总数(这样我就可以向用户显示它并使用它来弄清楚总页数等).
有没有办法获得结果的总数而不通过第二个查询,即从上面的查询中获取它?我已经尝试添加"max(rownum)",但它似乎不起作用(我得到一个错误[ORA-01747]似乎表明它不喜欢我在组中有关键字rownum).
我希望从原始查询中获取此信息而不是在单独的SQL语句中执行此操作的理由是"my_query"是一个昂贵的查询,所以我宁愿不运行它两次(一次得到计数,一次得到数据页面)如果我不需要; 但是,如果可能的话,我可以在单个查询中获得结果数量(同时获取我需要的数据页面)的任何解决方案都不应该增加很多额外的开销.请指教.
这正是我正在尝试做的事情,因为我认为它不喜欢我在组中使用ROWNUM,因此我收到了ORA-01747错误.注意,如果有另一种解决方案不使用max(ROWNUM),而是使用其他方法,那也完全没问题.这个解决方案是我第一次想到什么可行.
SELECT * FROM (SELECT r.*, ROWNUM RNUM, max(ROWNUM)
FROM (SELECT t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t0.LAST_NAME, t1.SCORE
FROM ABC t0, XYZ t1
WHERE (t0.XYZ_ID = 751) AND
t0.XYZ_ID = t1.XYZ_ID
ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30 GROUP BY r.*, ROWNUM) WHERE RNUM > 15
Run Code Online (Sandbox Code Playgroud)
---------编辑--------注意,基于第一个评论,我尝试了以下似乎工作.我不知道它与其他解决方案相比表现如何(我正在寻找满足我的要求但表现最佳的解决方案).例如,当我运行它需要16秒.当我取出COUNT(*)OVER()RESULT_COUNT时,只需7秒钟:
SELECT * FROM (SELECT r.*, …Run Code Online (Sandbox Code Playgroud) 我有一个Java存储过程,它使用Resultset对象从表中获取记录并创建一个csv文件.
BLOB retBLOB = BLOB.createTemporary(conn, true, BLOB.DURATION_SESSION);
retBLOB.open(BLOB.MODE_READWRITE);
OutputStream bOut = retBLOB.setBinaryStream(0L);
ZipOutputStream zipOut = new ZipOutputStream(bOut);
PrintStream out = new PrintStream(zipOut,false,"UTF-8");
out.write('\ufeff');
out.flush();
zipOut.putNextEntry(new ZipEntry("filename.csv"));
while (rs.next()){
out.print("\"" + rs.getString(i) + "\"");
out.print(",");
}
out.flush();
zipOut.closeEntry();
zipOut.close();
retBLOB.close();
return retBLOB;
Run Code Online (Sandbox Code Playgroud)
但生成的csv文件未显示正确的德语字符.Oracle数据库的NLS_CHARACTERSET值也为UTF8.
请建议.
我有一个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) 你能告诉我MAXVALUE序列中的最大值/最小值是MINVALUE多少,序列中的最小值/最大值是多少?
我创建了下表
CREATE TABLE PLACE(
POSTCODE VARCHAR(10) PRIMARY KEY,
STREET_NAME VARCHAR(10),
COUNTY VARCHAR(10),
CITY VARCHAR(10));
Run Code Online (Sandbox Code Playgroud)
我想改变name,county并city从varchar(10)到varchar(20).我怎么做?
作为PL/SQL中的新手,我一直在复制并粘贴以下触发器:
CREATE OR REPLACE TRIGGER FOO_TRG1
BEFORE INSERT
ON FOO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :NEW.FOO_ID IS NULL THEN
SELECT FOO_SEQ1.NEXTVAL INTO :NEW.FOO_ID FROM DUAL;
END IF;
EXCEPTION
WHEN OTHERS THEN RAISE;
END FOO_TRG1;
/
ALTER TRIGGER FOO_TRG1 ENABLE;
Run Code Online (Sandbox Code Playgroud)
我怀疑所包含的异常处理代码什么都不做,可能只是被删除,因为如果出现问题,我会收到一条错误消息.我对吗?
(我猜这样的代码是进一步编辑先前代码的结果.)