我试过以下查询:
select empno from (
select empno
from emp
order by sal desc
)
where rownum = 2
Run Code Online (Sandbox Code Playgroud)
这不会返回任何记录.
当我尝试这个查询
select rownum,empno from (
select empno from emp order by sal desc)
Run Code Online (Sandbox Code Playgroud)
它给了我这个输出:
ROWNUM EMPNO
1 7802
2 7809
3 7813
4 7823
Run Code Online (Sandbox Code Playgroud)
谁能告诉我第一次查询的问题是什么?为什么在添加ROWNUM过滤器时没有返回任何记录?
我想使用表TRAPTABCLOB中的sql提取Decision的值,该表具有列testclob,XML存储为clob.
示例XML如下.
<?xml version="1.0" encoding="UTF-8"?>
<DCResponse>
<Status>Success</Status>
<Authentication>
<Status>Success</Status>
</Authentication>
<ResponseInfo>
<ApplicationId>5701200</ApplicationId>
<SolutionSetInstanceId>
63a5c214-b5b5-4c45-9f1e-b839a0409c24
</SolutionSetInstanceId>
<CurrentQueue />
</ResponseInfo>
<ContextData>
<!--Decision Details Start-->
<Field key="SoftDecision">A</Field>
<Field key="**Decision**">1</Field>
<Field key="NodeNo">402</Field>
<Field key="NodeDescription" />
<!--Decision Details End-->
<!--Error Details Start-->
<Field key="ErrorResponse">
<Response>
<Status>[STATUS]</Status>
<ErrorCode>[ERRORCODE]</ErrorCode>
<ErrorDescription>[ERRORDESCRIPTION]</ErrorDescription>
<Segment>[SEGMENT]</Segment>
</Response>
</Field>
<Field key="ErrorCode">0</Field>
<Field key="ErrorDescription" />
</ContextData>
</DCResponse>
Run Code Online (Sandbox Code Playgroud) create table foo(
id number,
status varchar2(10)
);
Run Code Online (Sandbox Code Playgroud)
表创建.
insert into foo values( 1, 'open' );
insert into foo values( 2, 'close' );
insert into foo values( 3, 'open' );
insert into foo values( 4, 'open' );
insert into foo values( 5, 'close' );
create type foo_obj is object (
id number,
status varchar2(10)
);
/
create type foo_nt
as table of foo_obj;
/
create or replace package test_bulk
is
procedure temp;
end;
/
create or replace package body test_bulk …Run Code Online (Sandbox Code Playgroud) 任何人都可以解释一下执行计划和解释计划之间的区别.
当我执行
set autotrace traceonly;
select * from emp where empno=7369;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=1 Card=1 Bytes=38)
1 0 TABLE ACCESS BY INDEX ROWID SCOTT.EMP (Cost=1 Card=1 Bytes=38)
2 1 INDEX UNIQUE SCAN SCOTT.PK_EMP (Cost=0 Card=1)
Explain Plan
explain plan for select * from emp where empno=7369;
select * from table(dbms_xplan.display);
Plan hash value: 2949544139
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | …Run Code Online (Sandbox Code Playgroud) 我创建了一个过程并在其中使用了以下语句.
select sql_id into v_sql_id from v_$sql where sql_text =v_sql;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 PL/SQL: ORA-00942: table or view does not exist
我检查了它的所有者的同义词PUBLIC,所以它应该在这种情况下运行,但它不起作用.
另一件事我可以select sql_id from v_$sql where sql_text =v_sql;用简单的编辑器.任何人都可以帮助我.
Last_value窗口功能doesn't正常工作.
CREATE TABLE EXAMP2
(
CUSTOMER_ID NUMBER(38) NOT NULL,
VALID_FROM DATE NOT NULL
);
Customer_id Valid_from
-------------------------------------
9775 06.04.2013 01:34:16
9775 06.04.2013 20:34:00
9775 12.04.2013 11:07:01
--------------------------------------
select DISTINCT LAST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM ASC) rn
from examp1;
Run Code Online (Sandbox Code Playgroud)
当我使用时,LAST_VALUE我得到以下行:
06.04.2013 20:34:00
06.04.2013 01:34:16
12.04.2013 11:07:01
Run Code Online (Sandbox Code Playgroud)
当我使用时,FIRST_VALUE我得到以下行:
select DISTINCT FIRST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM DESC) rn
from examp1;
4/12/2013 11:07:01 AM
Run Code Online (Sandbox Code Playgroud)
First_value查询提供正确的输出.我希望从这些查询中获得相同的输出.我为什么要这样2 different results?
有没有办法在第二次批量收集后,数据不会覆盖第一次批量收集.我不想循环迭代.
DECLARE
TYPE abc IS RECORD (p_id part.p_id%TYPE);
TYPE abc_nt
IS
TABLE OF abc
INDEX BY BINARY_INTEGER;
v_abc_nt abc_nt;
BEGIN
SELECT p_id
BULK COLLECT
INTO v_abc_nt
FROM part
WHERE p_id IN ('E1', 'E2');
SELECT p_id
BULK COLLECT
INTO v_abc_nt
FROM part
WHERE p_id IN ('E3', 'E4');
FOR i IN v_abc_nt.FIRST .. v_abc_nt.LAST
LOOP
DBMS_OUTPUT.put_line (
'p_id is ' || v_abc_nt (i).p_id
);
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
注意:E1和E2出现在零件表中.
我想知道如何将两个条件中OR使用的最左边条件的结果返回 给LEFT JOINif true.
到目前为止我遇到的解决方案都涉及使用CASE声明SELECT,这确实意味着我放弃了该OR条款.
另一个解决方案涉及使用CASE语句ORDER BY.
是否有任何其他解决方案可以减少使用CASE陈述.我问的原因是因为现在只有两个,LEFT JOIN但随着时间的推移会增加更多.
SELECT item.id,
item.part_number,
lang.data AS name,
lang2.data AS description
FROM item
LEFT JOIN
language lang
ON item.id = lang.item
AND (lang.language = 'fr' OR lang.language = 'en')
LEFT JOIN
language lang2
ON item.id = lang2.item
AND (lang2.language = 'fr' OR lang2.language = 'en')
WHERE item.part_number = '34KM003KL'
Run Code Online (Sandbox Code Playgroud) 有没有办法使用绑定变量动态地将列名和表名传递给查询?这可以通过使用简单的连接运算符来完成||,但我想要一种不同的方法来实现这一点.
编辑
OPEN abc_cur FOR 'Select :column_name
from :table_name'
USING column_name,table_name;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我传递column_name的empno,ename,并table_name作为emp
但这种方法对我不起作用.除了传统的连接方法之外,是否有可能采用不同的方法?
我已经了解了大约PRAGMA INLINE11g的功能,但我无法区分它实际上如何优化我的代码.
我写了一段代码.
create or replace package test12
is
procedure getdata (p_job IN emp.job%TYPE
,p_total OUT number);
end test12;
/
create or replace package body test12
is
PROCEDURE total(p_empno IN EMP.EMPNO%TYPE
,p_total OUT integer)
IS
BEGIN
select sal into p_total from emp where empno=p_empno;
END total;
procedure getdata (p_job IN emp.job%TYPE
,p_total OUT number)
IS
type cur is ref cursor;
v_cur cur;
v_emp emp.empno%TYPE;
v_total integer:=0;
BEGIN
for i in 1..100000
loop
open v_cur for select empno from …Run Code Online (Sandbox Code Playgroud)