SQL Bug in "Minus" in correlated subquery presence of index (11.2.0.1.0)

SQL Bug in "Minus" in correlated subquery presence of index
(Oracle Database 11g Release 11.2.0.1.0)
Below, there is a small example that shows the bug. Further below,
there are some more comments.
drop table Country;
create table Country
(code VARCHAR2(4) constraint countrykey PRIMARY KEY,
name VARCHAR2(35));
-- if the key constraint is not given, the bug does not occur
drop table City;
create table City
(name VARCHAR2(35),
country VARCHAR2(4),
population number);
drop table Locatedon;
create table Locatedon
(city VARCHAR2(35),
country VARCHAR2(4),
island VARCHAR2(35));
insert into country values('E','Spain');
insert into country values('F','France');
insert into country values('S','Sweden');
insert into country values('GB','Sweden');
insert into city values('Ajaccio','F',53500);
insert into city values('Paris','F',2152423);
insert into city values('Palma','E',322008);
insert into city values('Madrid','E',3041101);
insert into city values('Stockholm','S',711119);
insert into city values('London','GB',6967500);
insert into locatedon values('Ajaccio','F','Corse');
insert into locatedon values('Palma','E','Mallorca');
insert into locatedon values('London','GB','Great Britain');
-- all countries that have a city that is not located on
-- some island: should be E, F, S.
Select c.name
From country c
Where exists
((Select name
From city
Where city.country=c.code)
minus
(Select city
From locatedon
Where locatedon.country=c.code)
-- wrong answer: only Sweden; Spain and France not in the answer!
select distinct country from
((Select name, country
From city)
minus
(Select city, country
From locatedon)
-- correct answer: E, F, S
Comments:
The bug has been found by students in our SQL course.
Using a larger database from that course, the bug can be reproduced
(same queries as above) at
http://www.semwebtech.org/sqlfrontend/
(wrong: 142 answers, correct: 154 answers)
During reducing it to a simple sample, there were some interesting
observations: trying with smaller and simpler tables (without the keys)
and synthetic data, the bug did not occur immediately. When
restating the query after about one day, the bug occurred. Obviously,
Oracle creates some index on its own in course of its internal
optimization that (or more exactly, its usage) exhibits the bug. The
query plan (showed in SQL Developer) was the same before and after.
Wolfgang

There's a typo in the test data - GB should presumably not be in Sweden. However....
the bug did not occur immediatelyIt's possible. But what would have almost certainly happened is that the execution plan DID change at some point. There are various reasons why it might not be immediate.
Obviously, Oracle creates some index on its own in course of its internal optimizationFar from obvious, what are you on about?
The query plan was the same before and afterBet you it wasn't.
A clear illustration of the issue and indication that it must be a bug is below.
Simply by hinting a different access method, we can change the result. Therefore, bug.
See [url http://support.oracle.com]Oracle Support and search for "wrong results".
Please raise with Oracle Support to get confirmation of bug.
There have been so many wrong results bugs recently, it's getting ridiculous.
It's a real issue, IMHO.
If you can't trust the DB to get your data right....
Note that the query plan is very much NOT the same and it is the difference in query plan which s that is the root cause of the bug.
SQL> select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
SQL> SELECT c.name
  2  FROM   country1 c
  3  WHERE  exists ((SELECT name
  4                  FROM   city1
  5                  WHERE  city1.country=c.code)
  6                  MINUS
  7                 (SELECT city
  8                  FROM   locatedon1
  9                  WHERE  locatedon1.country=c.code));
NAME
Sweden
SQL> SELECT /*+ full(c) */
  2         c.name
  3  FROM   country1 c
  4  WHERE  exists ((SELECT name
  5                  FROM   city1
  6                  WHERE  city1.country=c.code)
  7                  MINUS
  8                 (SELECT city
  9                  FROM   locatedon1
10                  WHERE  locatedon1.country=c.code));
NAME
Spain
France
Sweden
SQL> explain plan for
  2  SELECT c.name
  3  FROM   country1 c
  4  WHERE  exists ((SELECT name
  5                  FROM   city1
  6                  WHERE  city1.country=c.code)
  7                  MINUS
  8                 (SELECT city
  9                  FROM   locatedon1
10                  WHERE  locatedon1.country=c.code));
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 156929629
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT             |            |     1 |    27 |    12  (25)| 00:00:01 |
|   1 |  NESTED LOOPS                |            |       |       |            |          |
|   2 |   NESTED LOOPS               |            |     1 |    27 |    12  (25)| 00:00:01 |
|   3 |    VIEW                      | VW_SQ_1    |     6 |    24 |    10  (20)| 00:00:01 |
|   4 |     MINUS                    |            |       |       |            |          |
|   5 |      SORT UNIQUE             |            |     6 |   138 |            |          |
|   6 |       TABLE ACCESS FULL      | CITY1      |     6 |   138 |     4   (0)| 00:00:01 |
|   7 |      SORT UNIQUE             |            |     3 |    69 |            |          |
|   8 |       TABLE ACCESS FULL      | LOCATEDON1 |     3 |    69 |     4   (0)| 00:00:01 |
|*  9 |    INDEX UNIQUE SCAN         | COUNTRYKEY |     1 |       |     0   (0)| 00:00:01 |
|  10 |   TABLE ACCESS BY INDEX ROWID| COUNTRY1   |     1 |    23 |     1   (0)| 00:00:01 |
Predicate Information (identified by operation id):
   9 - access("VW_COL_1"="C"."CODE")
Note
   - dynamic sampling used for this statement (level=4)
26 rows selected.
SQL> explain plan for
  2  SELECT /*+ full(c) */
  3         c.name
  4  FROM   country1 c
  5  WHERE  exists ((SELECT name
  6                  FROM   city1
  7                  WHERE  city1.country=c.code)
  8                  MINUS
  9                 (SELECT city
10                  FROM   locatedon1
11                  WHERE  locatedon1.country=c.code));
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 1378726376
| Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT     |            |     1 |    23 |    14  (15)| 00:00:01 |
|*  1 |  FILTER              |            |       |       |            |          |
|   2 |   TABLE ACCESS FULL  | COUNTRY1   |     4 |    92 |     4   (0)| 00:00:01 |
|   3 |   MINUS              |            |       |       |            |          |
|   4 |    SORT UNIQUE       |            |     1 |    23 |     5  (20)| 00:00:01 |
|*  5 |     TABLE ACCESS FULL| CITY1      |     1 |    23 |     4   (0)| 00:00:01 |
|   6 |    SORT UNIQUE       |            |     1 |    23 |     5  (20)| 00:00:01 |
|*  7 |     TABLE ACCESS FULL| LOCATEDON1 |     1 |    23 |     4   (0)| 00:00:01 |
Predicate Information (identified by operation id):
   1 - filter( EXISTS ( (SELECT "NAME" FROM "CITY1" "CITY1" WHERE
              "CITY1"."COUNTRY"=:B1)MINUS (SELECT "CITY" FROM "LOCATEDON1" "LOCATEDON1"
              WHERE "LOCATEDON1"."COUNTRY"=:B2)))
   5 - filter("CITY1"."COUNTRY"=:B1)
   7 - filter("LOCATEDON1"."COUNTRY"=:B1)
Note
   - dynamic sampling used for this statement (level=4)
27 rows selected.Just to show that it's related to query transformation:
SQL> SELECT /*+ 
  2             no_query_transformation
  3         */
  4         c.name
  5  FROM   country1 c
  6  WHERE  exists ((SELECT name
  7                  FROM   city1
  8                  WHERE  city1.country=c.code)
  9                  MINUS
10                 (SELECT city
11                  FROM   locatedon1
12                  WHERE  locatedon1.country=c.code));
NAME
Spain
France
Sweden
SQL> Edited by: Dom Brooks on Jun 30, 2011 2:50 PM

Similar Messages

  • JDOQL Correlated Subquery - Bad SQL

    Hi,
    When I execute a JDOQL correlated subquery, the generated SQL is either
    invalid or incorrect. Exactly what happens depends on the exact query, and
    on the target database type, but I believe it all stems from the same
    problem, which has to do with table aliasing.
    If you need further details to reproduce this, please let me know. I'll be
    glad to help in any way I can to get this situation remedied quickly, as I
    am depending on this functionality. I have a test application to
    demonstrate the problem.
    I'm using Kodo 3.3.3 and application identity.
    Paul Mogren
    CommerceHub

    For the record, this is in part due to a bug in Kodo's SQL92 joining.
    See http://bugzilla.solarmetric.com/show_bug.cgi?id=1156
    -Patrick
    Paul Mogren wrote:
    Certainly... Here's a simple example using Microsoft's JDBC Driver for SQL
    Server 2000, and kodo.jdbc.sql.SQLServerDictionary, which produces invalid
    SQL.
    The query:
    pm.newQuery(Container.class,
    "(select from Entry entry where entries.contains(entry) &&
    entry.containedId != 1).isEmpty()");
    The classes:
    class Contained {
    private int id; //pk
    class Container {
    private int id; //pk
    private Set entries = new HashSet(); //<Entry>
    class Entry {
    private int containerId; //pk
    private int containedId; //pk
    private Container container; //persistent-redundant
    private Contained contained; //persistent-redundant
    The result:
    Incorrect syntax near the keyword 'WHERE'. {prepstmnt 31598780 SELECT
    t0.container_id, t0.lock FROM  WHERE (NOT EXISTS (SELECT DISTINCT
    t2.contained_id, t2.container_id FROM dbo.entry t2 WHERE (t1.contained_id
    = t2.contained_id AND t1.container_id = t2.container_id AND
    t2.contained_id <> ?) AND t0.container_id = t1.container_id))
    [params=(int) 1]} [code=156, state=HY000]
    Patrick Linskey wrote:
    Hi Paul,
    Kodo's correlated subquery support does have some known limitations. Can
    you post a sample JDOQL statement + corresponding SQL statement?
    -Patrick
    Paul Mogren wrote:
    Hi,
    When I execute a JDOQL correlated subquery, the generated SQL is either
    invalid or incorrect. Exactly what happens depends on the exact query, and
    on the target database type, but I believe it all stems from the same
    problem, which has to do with table aliasing.
    If you need further details to reproduce this, please let me know. I'll be
    glad to help in any way I can to get this situation remedied quickly, as I
    am depending on this functionality. I have a test application to
    demonstrate the problem.
    I'm using Kodo 3.3.3 and application identity.
    Paul Mogren
    CommerceHub

  • Top n Analysis using correlated subquery

    Please explain this query. It is doing top n analysis using correlated subquery. I need explaination of execution of this query.
    Select distinct a.sal
    From emp a
    where 1=(select count ( distinct b.sal) from emp b
         where a.sal <=b.sal)
    Thanks in advance

    Try breaking the query down and rewriting it in order to follow the logic;
    SQL> --
    SQL> -- Start by getting each salary from emp along with a count of all salaries in emp
    SQL> --
    SQL> select   a.sal,
            (select count (distinct b.sal) from scott.emp b ) count_sal
    from scott.emp a
    order by 1 desc
           SAL  COUNT_SAL
          5000         12
          3000         12
          3000         12
          2975         12
          2850         12
          2450         12
          1600         12
          1500         12
          1300         12
          1250         12
          1250         12
          1100         12
           950         12
           800         12
    14 rows selected.
    SQL> --
    SQL> --Add a condition to the count for only salaries below or equal to the current salarySQL> --
    SQL> select   a.sal,
            (select count (distinct b.sal) from scott.emp b where a.sal <=b.sal) rank_sal
    from scott.emp a
    order by 1 desc
           SAL   RANK_SAL
          5000          1
          3000          2
          3000          2
          2975          3
          2850          4
          2450          5
          1600          6
          1500          7
          1300          8
          1250          9
          1250          9
          1100         10
           950         11
           800         12
    14 rows selected.
    SQL> --
    SQL> -- Add a condition to only pick the nth highest salary
    SQL> --
    SQL> select    a.sal,
             (select count (distinct b.sal) from scott.emp b where a.sal <=b.sal) rank_sal
    from scott.emp a
    where (select count (distinct b.sal) from scott.emp b where a.sal <=b.sal) = 4
           SAL   RANK_SAL
          2850          4
    1 row selected.Hope this helps.

  • How does oracle execute a correlated subquery .... some confusion

    How does oracle 10g execute a correlated subquery?
    I read some articles online & i am a little confused.
    example:
    select * from emp e
    where e.deptno in (select d.deptno from dept d
    where e.deptno = d.deptno);
    My questions .......
    1.In the above example, does oracle read the entire outer table first and then run the inner query using the rows returned by the outer query?
    I read in some articles that they execute simultaneously.
    How does this work?
    2.Should the inner query have lesser amount of rows compared to the outer query for a good performance?
    3.Can every correlated subquery be converted to a join and if so which one to use?
    Truly appreciate any inputs on how oracle executes it at the backend.
    Thanks in advance.

    user10541890 wrote:
    How does oracle 10g execute a correlated subquery?
    I read some articles online & i am a little confused.
    example:
    select * from emp e
    where e.deptno in (select d.deptno from dept d
    where e.deptno = d.deptno);
    My questions .......
    1.In the above example, does oracle read the entire outer table first and then run the inner query using the rows returned by the outer query?
    I read in some articles that they execute simultaneously.
    How does this work?SQL is not a procedural language. SQL code specifies what the system sill do, not how the system wlll do it; that's entirely up to the system.
    What does it matter to you whether the two are done together, or if one is completed before the other begins?
    The system will probably choose to run ucorellated subqueiris only once, and correlated queries multiple times as needed.
    2.Should the inner query have lesser amount of rows compared to the outer query for a good performance?That usually doesn't matter.
    It some cases, you may want to consider whether the subquery is correlated or not. If the subquery is very costly, and produces, say, 1 million rows, but you know the main query will only produce about 5 rows, then you may want to do a correlated subquery rather than an uncorrelated one.
    3.Can every correlated subquery be converted to a join and if so which one to use?I believe so.
    Use whichever is easier to code and debug. That will change depnding on the data and the requirements.
    If performance is an issue, try different ways. Usually, where I've noticed a big difference, join was fastest.
    By the way, it's unusual to have a correlated IN-subquery.
    Usually IN-subqueris are uncorrelated, like this:
    select  *
    from      emp     e
    where     e.deptno     in ( select  d.deptno
                        from    dept     d
                      );(This and the queries below produce the same resutls as your original query.)
    Correlated subqueries are usually used for scalar subqueries or EXISTS subqueries, like this:
    select  *
    from      emp     e
    where     EXISTS ( select  d.deptno
               from    dept     d
                    where   e.deptno = d.deptno
                );To do the same thing with a join:
    select  e.*
    from      emp     e
    join     dept     d     on     e.deptno     = d.deptno
    ;assuming dept.deptno is unique.

  • How to optimize this sql by writing MINUS function.

    Hi all,
    how to optimize the sql by writing MINUS function.
    these are my tables
    1. CREATE TABLE POSTPAID
    RECORD VARCHAR2(2000 BYTE),
    FLAG NUMBER
    Record format:
    Mobile no in 1:10 of that length
    2. CREATE TABLE SUBSCRIBER
    PHONE_NO VARCHAR2(10 BYTE)
    My requirement is following sql need write using ‘minus’ as this one is very slow
    select record record from POSTPAID where substr(record,9,10) NOT in (select PHONE_NO from SUBSCRIBER)
    Thanks

    Why are you very particular about using "MINUS". You can optimize the sql by using "NOT EXISTS" instead of "NOT IN" as below:
    SELECT RECORD FROM POSTPAID A WHERE NOT EXISTS (SELECT 1 FROM SUBSCRIBER B WHERE SUBSTR(A.RECORD,9,10) = B.PHONE_NO)

  • Performance of using a Select For Update vs a correlated subquery

    I was wondering wether or not it is more effecient to use the
    Select ... For Update (with a cursor etc.) versus a correlated
    subquery.
    I can accomplish the same thing with either however performance
    at our site is an issue.

    Use select for update cursor as that is faster as it updates
    based on the rowid. One thing to keep in mind is that rowid is
    session specific and the rows to be updated get locked so that
    nobody else can update them till the lock is released. I have
    had very good performance results with these cursors.
    Good luck !
    Sudha

  • Difference between a regular subquery and a correlated subquery

    Can someone explain EXACTLY what is a correlated subquery and could you give me an example? I'm taking an Oracle DBA class and I would appreciate your feedback. Thanks. :)

    "Normal" subquery (the subquery is executed only once for the statement):
    select name
    from emp
    where salary > (select avg(emp2.salary) from emp emp2);
    Correlated subquery (it is executed for each row of the main query):
    select name
    from emp
    where salary > (select avg(salary) from emp emp2
    where emp2.deptno = emp.deptno);
    Can someone explain EXACTLY what is a correlated subquery and could you give me an example? I'm taking an Oracle DBA class and I would appreciate your feedback. Thanks. :)

  • How SQL engine evaluates a correlated subquery ?

    SELECT deptno,ename,sal FROM emp t WHERE sal >
    (SELECT AVG(sal) FROM emp WHERE t.deptno = deptno)
    ORDER BY deptno;
    To get the result table of inner query there should be the table t, which is an instance of the outer result table, that depends on the inner result table. How this query will be processed by SQL engine. I would appriciate, If anybody clarify my doubt.
    Thanks.

    I have created PLAN_TABLE by running utlxplan.sql and grant access to everyone, but I couldn't create synonym to that table, when I tried to create synonym I got the error[b] ORA-01031: insufficient privileges .
    I continued to run the explain plan command for my query. I got the following result. I am really confused with this result, cause I am not familiar with the paln table. Could you please tell me how can I get information from this plan table to trace steps taken by the SQL engine to execute the query.
    Thanks.
    SQL> explain plan for SELECT deptno,ename,sal FROM emp t WHERE sal >
    2 (SELECT AVG(sal) FROM emp WHERE t.deptno = deptno)
    3 ORDER BY deptno;
    Explained.
    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
    PLAN_TABLE_OUTPUT
    | Id | Operation | Name | Rows | Bytes | Cost |
    | 0 | SELECT STATEMENT | | | | |
    | 1 | SORT ORDER BY | | | | |
    |* 2 | FILTER | | | | |
    | 3 | TABLE ACCESS FULL | EMP | | | |
    | 4 | SORT AGGREGATE | | | | |
    |* 5 | TABLE ACCESS FULL| EMP | | | |
    PLAN_TABLE_OUTPUT
    Predicate Information (identified by operation id):
    2 - filter("SYS_ALIAS_1"."SAL"> (SELECT AVG("EMP"."SAL") FROM
    "EMP" "EMP" WHERE "EMP"."DEPTNO"=:B1))
    5 - filter("EMP"."DEPTNO"=:B1)
    Note: rule based optimization
    20 rows selected.

  • Correlated Subquery Issue

    the following sample is from ORACLE DATABASE 10g SQL
    i don't understand how it works, the bellow is the table and the query
    SELECT Product_id pid, product_type_id ptid, name, price
    FROM products
    PID PTID NAME PRICE
    1 1 Modern Science 19.95
    2 1 Chemistry 30
    3 2 Supernova 25.99
    4 2 Tank War 13.95
    5 2 Z Files 49.99
    6 2 2412: The Return 14.95
    7 3 Space Force 9 13.49
    8 3 From Another Planet 12.99
    9 4 Classical Music 10.99
    10 4 Pop 3 15.99
    11 4 Creative Yell 14.99
    PID PTID NAME PRICE
    12 My Front Line 13.49
    the query
    SELECT product_id pid, product_type_id ptid, name, price
    FROM products outer
    WHERE price >
    (SELECT AVG(price)
    FROM products inner
    WHERE inner.product_type_id = outer.product_type_id)
    PID PTID NAME PRICE
    2 1 Chemistry 30
    5 2 Z Files 49.99
    7 3 Space Force 9 13.49
    10 4 Pop 3 15.99
    11 4 Creative Yell 14.99
    what i don't understand is HOW and WHEN the AVG function works and HOW AVG() function knows to calculate the average by grouping the PTID not the average of ALL PRICE column.
    tks for helping in advance

    The subquery
    (SELECT AVG(price)
       FROM products inner
      WHERE inner.product_type_id = outer.product_type_id)knows to create an average of all the products with the same product type because of the WHERE clause, which limits the rows returned to those with the product_type_id in the outer.
    Conceptually, what happens is
    - the outer query gets the first row of the table (PID=1)
    - it grabs the price (19.95)
    - now, it runs the subquery to determine whether this is above average
    - the subquery sees that outer.product_type_id is 1, so the WHERE clause eliminates all but the first two rows (PID 1&2). The average of 19.95 and 30 is 24.975.
    - Since the price of the first row is not greater than 24.975, Oracle knows that it does not meet the conditions of the WHERE clause in the outer query.
    - Repeat for each row in the outer query
    Obviously, since Oracle is doing set-based processing, it may not work exactly this way internally. Conceptually, though, this is how correlated subqueries work.
    Justin
    Distributed Database Consulting, Inc.
    http://www.ddbcinc.com/askDDBC

  • Correlated Subquery in ORDER BY

    The following is a valid sql. But, what is meant by a correlated scalar subquery in the ORDER BY clause?
    SELECT employee_id, last_name
    FROM employees e
    ORDER BY (SELECT department_name
    FROM departments d
    WHERE e.department_id=d.department_id);

    It is exactly the same in the ORDER BY clause as in any other part of a query. As biswabijay says, the correlated query is run once for each row in the result set.
    In essence, the fileds selected from the correlated query are added to the result for each row, then evaluated in the appropriate context (e.g. compared in a WHERE clause, used for sorting in an ORDER BY).
    A small addition to your original query makes this more apparent.
    SQL> SELECT employee_id, last_name, department_name
      2  FROM employees e, departments d
      3  WHERE e.department_id=d.department_id
      4  ORDER BY (SELECT department_name
      5  FROM departments d
      6  WHERE e.department_id=d.department_id);
    EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME
            205 Higgins                   Accounting
            206 Gietz                     Accounting
            200 Whalen                    Administration
            100 King                      Executive
            101 Kochhar                   Executive
            102 De Haan                   Executive
            185 Bull                      Shipping
            144 Vargas                    Shipping
            143 Matos                     Shipping
            184 Sarchand                  ShippingHTH
    John

  • PL/SQL Bug in SQL Developer?

    SQL Developer v 1.1.1.25 running on Windows XP.
    I have a PL/SQL procedure that does not compile with debug in SQL Developer. Compiling it with debug produces the following error:
    an Error(1): PLS-00801: internal error [79110].The only way I was able to get the procedure to compile in SQL Developer was to add the 4th line. If I uncomment the 4th line it compiles with debug. Why??
    Here is the procedure:
    CREATE OR REPLACE
    PROCEDURE BOGUS AS
      CURSOR c1 IS
        SELECT dummy FROM DUAL;
    --  x c1%ROWTYPE;
      PROCEDURE test ( rec IN OUT c1%ROWTYPE) IS
      begin
        null;
      end;
    BEGIN
      NULL;
    END BOGUS;Message was edited by:
    marife
    I played around some more with the procedure and discovered the problem. The key is the compiling with debug. I believe that compile with debug cannot build the debug information for a %ROWTYPE as a parameter. But if I define a local variable of that %ROWTYPE, then the compile with debug knows what debug information to track for the %ROWTYPE.
    I discovered that in SQL*Plus it compiles, but when you issue the ALTER PROCEDURE bogus COMPILE DEBUG, it does not compile. This is a problem with the debug option for compiling and not a problem with SQL Developer.
    Sorry for the posting. Hopefully this information will save other times and fustration.
    Mike

    Just for anyone else searching on this bug - I get the same error with certain procedures in TOAD when compiling with DEBUG.
    Fortunately nobody here has the first clue how to use TOAD debug so it's only ever switched on by accident or after a reinstall (it's the default) - so turning debug off fixes the problem.

  • HTMLDB 1.6 load_de.sql bug ?

    I installed HTMLDB 1.6 as an upgrade to the one on the companion CD.
    Since my native language is german, I like to have HTMLDB speaking german language with me. So I opened sqlplus as sys with sysdba privs, altered the session schema to FLOWS_010600 and started the Language update via @load_de.
    after some working statements I got the following error message and the installation stops:
    Error page=4316.4003 item="F4000_P4316_VALIDATION_TYPE" id="22211144053.4003"
    declare
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at "SYS.OWA_UTIL", line 325
    ORA-06512: at "SYS.HTP", line 1322
    ORA-06512: at "SYS.HTP", line 1397
    ORA-06512: at "SYS.HTP", line 1689
    ORA-06512: at "FLOWS_010600.WWV_FLOW_API", line 3191
    ORA-01461: can bind a LONG value only for insert into a LONG column
    ORA-06512: at line 69
    Any hints ?
    cu Pete

    Peter,
    I believe there's a bug lurking in HTML DB somewhere. Your situation is identical to the one described in:
    Re: Installation Error 1.6
    The odd thing is, we have been unable to reproduce it (loading with NLS_LANG german_germany.al32utf8 works just fine). I also asked a couple colleagues in Germany if they've had any difficulty, and they have never encountered this.
    If you would be so kind, could you please let me know the following information:
    1) The database version you are using
    2) The operating system (name and version)
    3) Your database character set
    4) The version and operating system of SQL*Plus you're using (in the event you're doing this installation remotely)
    If you feel uncomfortable posting this on OTN, could you please just e-mail this info to [email protected]?
    Thanks in advance for any assistance you can provide.
    viele Grüße,
    Joel

  • Correlated subquery alternatives?

    Before I start, this is a production system and I am not allowed to alter ANY of the tables involved: so no new columns are allowed, tables can't be changed into being materialized views, and no I can't just re-design the entire application that I've inherited! The ONLY thing I can do is change the SQL code used to perform assorted tasks. The tables involved have all got fresh statistics computed, too, so this isn't a question about improving my DBA techniques. Nor is it a question about tuning the performance of existing code (which already has good execution plans).
    I have a large table, called SEARCH. It is a copy of a lot of data from a table called SOURCE (not all of the data, because some is filtered out). SOURCE has about 7 million rows. SEARCH has about 5 million. From time to time, records in SOURCE have their status changed from ACTIVE to INACTIVE. If they are marked INACTIVE, they are not allowed to be in SEARCH. Weekly, we re-synch the SEARCH data with the SOURCE -so, it's during that weekend refresh operation that this sort of query is issued:
    delete from SEARCH where IDENTIFIER in (select IDENTIFIER from SOURCE where STATUSCODE != 1);It's a delete using a standard correlated sub-query. It takes slightly over five minutes to run, which is OK, but I would like to know if there's any alternative SQL or SQL constructs/features/enhancements which could be used to perform the same sort of thing more quickly. As I say, I'm not asking how to tune this sort of thing: I'm asking rather if there are alternatives to it. If there isn't, that's OK.
    I should perhaps add that the STATUSCODE column is not found in the SEARCH table (because if the record's in SEARCH, it would be because the status was =1 in SOURCE originally)

    I tried very hard to prevent this sort of post, but clearly I have not succeeded.
    The question actually asked whether there were SQL constructs which could act as an alternative to a correlated sub-query. I see two people have been able to supply such alternatives.
    Those people did not need to double-think what 'active' and 'inactive' meant, or whether the value stored in the statuscode column was 'active' or '1' (I expect they were smart enough to work out that a "status" of active can be encoded in a column called "statuscode" with a value of '1')
    Those people did not read the words "I can't alter any of the tables" and then decide to ignore them as you have (creating an index on a table counts as altering the table in my book and in this context)
    Those people did not read the words 'fresh statistics have been computed' and decide to suggest calculating even fresher statistics that include histograms.
    Those people did not need to start guessing what my data distribution for inactive records is.
    Those people did not read the words "[This is not] a question about tuning the performance of existing code (which already has good execution plans)" and ignore them, deciding in their arrogance that maybe those execution plans needed to be discussed after all.
    Why can't you and others like you just stick to answering the question as asked for once? Two other people in this exchange have managed to do just that, yet so many of these 'thousands of posts to my name' frequenters of these forums seem completely incapable of doing so. It is very strange, very frustrating and I wish you wouldn't do it.

  • SQL Help - Using Minus command

    Hey Sql forum
    I'm using ver: Oracle 8.1.7.0.0
    Quick Question for all of you.
    I'm trying to run this query.
    When I add my order by on each select statement the query doesn't work.
    But when I remove the two order by statements on each query it works just fine.
    Why is that?
    Please get back to me thanks.
    Query:
    select
    b.em_employee_id,
    b.tcf_date_worked,
    b.tcf_hours,
    b.tcf_pdt_code,
    b.tcf_payroll_unit
    from tcf b
    where b.tcf_year = '2006' and b.tcf_run_id in ('XXXX')
    order by b.em_employee_id, b.tcf_date_worked, b.tcf_pdt_code, b.tcf_hours
    minus
    select
    a.em_employee_id,
    a.tcfa_date_worked,
    a.tcfa_hours,
    a.tcfa_pdt_code,
    a.tcfa_payroll_unit
    from tcfa a
    where a.tcfa_year = '2006' and a.tcfa_run in ('1234')
    order by a.em_employee_id, a.tcfa_date_worked, a.tcfa_pdt_code, a.tcfa_hours ;
    }

    Using the positional notation (1,2,3...) is often frowned upon because a change in the order of the columns in your select lists will cause the query to be sorted differently.
    The other option is to use the appropriate column aliases so that the column names from both queries "line up". Then use the aliases in your order by.
    SQL> select deptno dno, dname dnm
      2  from   dept
      3  union all
      4  select deptno dno, dname dnm
      5  from   dept
      6  order  by dnm, dno;
                     DNO DNM
                      10 ACCOUNTING
                      10 ACCOUNTING
                      40 OPERATIONS
                      40 OPERATIONS
                      20 RESEARCH
                      20 RESEARCH
                      30 SALES
                      30 SALES
    8 rows selected.(used dept instead of dual)
    Message was edited by:
    Eric H

  • HTML DB authorisation via PL/SQL bug?

    I tried to implement a simple authorisation package and failed. This seems to be a bug in HTML DB.
    See below for package body. I have a function check_user and a procedure check_user2.
    When I enter a call to the procedure in my Authorization Scheme (PL/SQL Function Returning Boolean) I get what I deserve:
    auth2.check_user2(:APP_USER)
    results in: ORA-06503: PL/SQL: Function returned without value
    When I use the function instead however the error I get seems less justified:
    auth2.check_user(:APP_USER)
    ORA-06550: line 1, column 44: PLS-00221: 'CHECK_USER' is not a procedure or is undefined ORA-06550: line 1, column 44: PL/SQL: Statement ignored
    It seems HTML DB is checking to make sure it finds a 'procedure' - but it really needs a 'function'...
    Just for completeness the package body:
    create or replace package body auth2
    is
    function check_user( P_USER IN VARCHAR2) return boolean
    as
    begin
    insert into hr_log (log_txt) values (p_user);
    return True;
    end check_user;
    procedure check_user2( P_USER IN VARCHAR2)
    as
    begin
    insert into hr_log (log_txt) values (p_user);
    commit;
    end check_user2;
    end auth2;
    /

    Peter - When HTML DB calls for a Function Returning Boolean it's looking for you to have specified a call to a function whether you put the code within a begin-end or you let HTML DB do it. What you entered was (when framed in begin-end) syntactically a procedure call within an anonymous block. Try entering "return auth2.check_user(:APP_USER);" (without quotes).
    Scott

Maybe you are looking for