Skip to Main Content

DevOps, CI/CD and Automation

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

XMLQuery select and where clause

Mameli75Mar 17 2022

Hello,
Every PO line needs it's own <property name="ln.ItemGroup"> element in UserArea:
po line 10 has R350, getItemGroupByItem('KR350', ..., ...)
po line 20 has R100, getItemGroupByItem('KR100', ..., ...)
I've got the correct results but not has expected ... I have twice for each po line while each one should have it's own as above ... where is it wrong? i have added the clause "where i$/DataArea ..." but maybe I do not understand how that works.

<DataArea>
<PurchaseOrder>
<PurchaseOrderHeader>
...
</PurchaseOrderHeader>
<PurchaseOrderLine>
<LineNumber>10</LineNumber>
<Item>
<ItemID>
<ID>KR350</ID>
</ItemID>
</Item>
<UserArea>
...
</UserArea>
</PurchaseOrderLine>
<PurchaseOrderLine>
<LineNumber>20</LineNumber>
<Item>
<ItemID>
<ID>KR100</ID>
</ItemID>
</Item>
<UserArea>
...
</UserArea>
</PurchaseOrderLine>
</PurchaseOrder>
</DataArea>

FOR r IN (
SELECT ExtractValue(Value(p),'/PurchaseOrderLine/Item/ItemID/ID/text()') as itemId,
ExtractValue(Value(p),'/PurchaseOrderLine/LineNumber/text()') as lineNumber
FROM TABLE(XMLSequence(Extract(xmlContent,'DataArea/PurchaseOrder/PurchaseOrderLine'))) p
) LOOP
BEGIN

ItemGroup := getItemGroupByItem(trim(r.itemId), AccountingEntityID, LogicalID);

xml_string := '<Property><NameValue name="ln.ItemGroup" type="StringType">'||ItemGroup||'</NameValue></Property>';

   UPDATE LN\_BOD\_DECORATION  
   SET BOD\_SPEC =   
   XMLQuery('copy $i := $p1 modify  
       (for $j in $i/DataArea/PurchaseOrder/PurchaseOrderLine/UserArea where $i/DataArea/PurchaseOrder/PurchaseOrderLine/LineNumber =' || lineNumber   
        return (# ora:child-element-name Property #)  
         {insert node $p2 into $j})  
        return $i'  
   PASSING BOD\_SPEC AS "p1",  
         XMLType(xml\_string) AS "p2"      
    RETURNING CONTENT)  
   WHERE BOD\_NAME = 'SyncPurchaseOrder';  
   COMMIT;  

END;
END LOOP;
Thanks.
BR.
Marco.

Comments

843793
Well, this was a shot in the dark, but I tested it and it seems to be the problem: remove the parens around i.next()!

After doing so, running the code in your post instead provides a "NoSuchElementException" from the iterator (completely expected). I'm not sure if this a bug in the compiler, or if it has something to do with the way the code gets expanded. Maybe if someone thinks about it long enough they'll be able to come up with a reason.
843793
Why would you expect to use those parens like that anyway?
843793
Why would you expect to use those parens like that
anyway?
I can see that the parens are redundant - and as the other responder pointed out, the error goes away when they are removed...however, I'm still curious...

Firstly, is it actually an error to use the parentheses in that way?

Secondly, although the offending line is executed in the example I gave, the code that I pulled the example from is a bit stranger - when I try to instantiate a class (call it B), that contains a method with the redundant parentheses, I get the same error - even though the offending line isn't executed (I can post the code tonight if anyone is interested).

Gareth
843793
Here's the code:

import java.util.*;
class A {
public static void main (String argv[]) {
B bb = new B();
}
}

class B {

void methodC() {
ArrayList<Boolean> B = new ArrayList<Boolean>(10);
Iterator<Boolean> i = B.iterator();
boolean b = (i.next()).booleanValue();
}
}

843793
This is definitely a bug in the compiler. The bytecode generated for B.methodC() is:

Codeview "bytecode" for void B.methodC():
#3/Test.java:12 - new class java.util.ArrayList
#4/Test.java:12 - dup
#5/Test.java:12 - bipush (byte)10
#6/Test.java:12 - invokespecial public java.util.ArrayList(int)
#7/Test.java:12 - astore_1 lv_1
#8/Test.java:13 - aload_1 lv_1
#9/Test.java:13 - invokevirtual public java.util.Iterator java.util.AbstractList.iterator()
#10/Test.java:13 - astore_2 lv_2
#11/Test.java:14 - aload_2 lv_2
#12/Test.java:14 - invokeinterface public abstract java.lang.Object java.util.Iterator.next()
#13/Test.java:14 - invokevirtual public final boolean java.lang.Boolean.booleanValue()
#14/Test.java:14 - istore_3 lv_3
#15/Test.java:15 - return

and it's clear that between instruction #12 and instruction #14 a typecast is missing.

I'll add this to my list of known prototype compiler bugs at
http://cag.lcs.mit.edu/~cananian/Projects/GJ/
1 - 5

Post Details

Added on Mar 17 2022
1 comment
457 views