小编Gau*_*oni的帖子

使用rownum选择表的第二行

我试过以下查询:

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过滤器时没有返回任何记录?

sql oracle oracle10g rownum

21
推荐指数
2
解决办法
7万
查看次数

使用Oracle数据库中的SQL从XML Clob中提取数据

我想使用表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)

xml sql oracle parsing clob

17
推荐指数
1
解决办法
9万
查看次数

ORA-00947全局声明类型时没有足够的值

 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)

oracle plsql oracle11g ora-00947

15
推荐指数
1
解决办法
2万
查看次数

解释计划和执行计划之间的区别

任何人都可以解释一下执行计划和解释计划之间的区别.

当我执行

 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)

oracle sql-execution-plan

14
推荐指数
2
解决办法
2万
查看次数

PL/SQL:ORA-00942:表或视图不存在V $ SQL

我创建了一个过程并在其中使用了以下语句.

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;用简单的编辑器.任何人都可以帮助我.

database plsql oracle10g oracle11g

8
推荐指数
1
解决办法
3万
查看次数

Last_value窗口功能无法正常工作

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

oracle window-functions

8
推荐指数
2
解决办法
5462
查看次数

批量收集两次相同的嵌套表

有没有办法在第二次批量收集后,数据不会覆盖第一次批量收集.我不想循环迭代.

    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:

  • p_id是E3
  • p_id是E4

注意:E1和E2出现在零件表中.

oracle plsql oracle11g bulk-collect

5
推荐指数
1
解决办法
7718
查看次数

LEFT JOIN使用OR

我想知道如何将两个条件中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)

sql join default-value

4
推荐指数
1
解决办法
1万
查看次数

使用绑定变量动态传递表和列名称

有没有办法使用绑定变量动态地将列名和表名传递给查询?这可以通过使用简单的连接运算符来完成||,但我想要一种不同的方法来实现这一点.

编辑

OPEN abc_cur FOR 'Select :column_name
                  from :table_name' 
                USING column_name,table_name;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我传递column_nameempno,ename,并table_name作为emp

但这种方法对我不起作用.除了传统的连接方法之外,是否有可能采用不同的方法?

sql oracle plsql oracle11gr2

4
推荐指数
2
解决办法
1万
查看次数

Pragma inline没有显示出明显的改善?

我已经了解了大约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)

oracle plsql oracle11gr2

4
推荐指数
1
解决办法
1533
查看次数