For partners that build or integrate commercially available applications and service solutions with the Oracle Cloud Platform
For partners that provide implementation or managed services around Oracle Cloud Applications
Hello There,
We are using Oracle Financials Cloud and BI Publisher. I have a simple WITH Clause sql construct. On execution it gives the below error. .
Could you please advise on what needs to be corrected?
oracle.xdo.servlet.data.DataException: oracle.xdo.servlet.data.DataException: oracle.xdo.servlet.data.DataException: oracle.xdo.XDOException: java.sql.SQLException: Invalid column index
Database Version:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE 12.1.0.2.0 Production
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production
SQL Query:
WITH FUNCTION GetValue1 (p_value VARCHAR2) Return VARCHAR2 IS
CURSOR c1 IS
SELECT 'aa' aa FROM dual WHERE p_value = 'ABC';
cc VARCHAR2(100);
BEGIN
FOR x IN c1
LOOP
cc := x.aa;
END LOOP;
RETURN cc;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'Error GetValue1: '|| p_value;
END GetValue1;
------------
PO AS
(SELECT * FROM po_headers_all)
------------
, POLines AS
(SELECT * FROM po_lines_all)
------------
--Main Query
------------
SELECT po.segment1, polines.po_header_id , GetValue1('ABC') GetValue
FROM PO, POLines
WHERE polines.po_header_id = po.po_header_id
Thank you.
Look forward to hearing from you.
Regards,
Don
Hi Donald.
This is just me and my standards, so ignore this first lines if you want. There is one thing that always bugs me when I see some Data Models. It is the "SELECT * FROM table". It may not be the your case but, if something change in the table structure your Data Model will be affected and you are selecting more than you need.
Does this work fine on SQL Developer? I believe it will so I think it is something related to the way BI Publisher interacts with the database.
Can you download the Engine Log from the data model for more details and share with us.
Are you able to add just the columns you need on those two WITH block PO and POLINES and test again?
Cheers
Fernando
Hello Fernando,
Thank you for taking the time to look into the issue and for your reply.
The query works fine outside BI Publisher, no problem.
I tried to add alias to the columns in the main query, no benefit.
I have attached the engine log file for your reference.
Also, below change I did, discable statements FOR LOOP and it works good. Attached it's 'engine log file 2.txt' for your reference:
Look forward to hearing from you.
Regards,
Donald
Hi Donald
I think the first error was because of the following part in your original code.
FOR x IN c1
LOOP
cc := x.aa;
END LOOP;
RETURN cc;
[2019-11-18T07:54:45.258+00:00][dp id:463169166][sch info:]Bind Variables ...
[2019-11-18T07:54:45.258+00:00][dp id:463169166][sch info:] 1: :null
[2019-11-18T07:54:45.259+00:00][dp id:463169166][sch info:]XMLGEN:Exception while processing datamodel...:__ora_fusion_user__temp_81910071_8fb6_4741_9ac3_042425fc62e8_xdm
[2019-11-18T07:54:45.259+00:00][dp id:463169166][sch info:]Process Cancelled Stage:false
[2019-11-18T07:54:45.259+00:00][dp id:463169166][sch info:]XMLPGEN:Invalid column index
[2019-11-18T07:54:45.259+00:00][dp id:463169166][sch info:]java.sql.SQLException: Invalid column index
If I'm not wrong when you use ":" in BI Publisher it will expect a Parameter right? That is why if failed exactly on that validation.
Once you removed in the second example the Error became a Warning in the Engine Log 2.
Cheers
Fernando
Hello Fernando,
Yes I noticed that := assignment was creating the problem, thank you.
But in a PL/SQL function you have to assign the values to a variable in that method, whereas BI Publisher doesn't accept it. How to overcome this issue in BIP?
Regards,
Donald
Hi Donald.
I would transfer the function to the database instead of being part of the WITH block. Especially if you plan to reuse it.
I like the challenge so I will do some tests too. So far I don't know an answer for the workaround in the Data Model. Hope someone else has the same issue and come with some ideas.
Cheers
Fernando
Hello Fernando,
We are working with Oracle Cloud Financials, so creating the function in database is not possible and therefore the use of FUNCTION in the WITH clause.
Thank you for spending time on this issue. Would love to hear how to get around it.
If I come across any solution,will keep you updated.
Regards,
Donald
Engine Log File 2.txt attachment
Regards,
Donald
Hi Donald.
The only weird thing I found in the engine log was.
Just to remove that warning can you add an alias to your "polines.po_header_id"
Just another note. Can you modify the with block to the construction below.
PO AS
(SELECT Segment1 FROM po_headers_all)
, POLines AS
(SELECT PO_Header_Id FROM po_lines_all)
Cheers
Fernando
Hi Donald.
Forgot about some options in the Data Model.
The following works.
Type of SQL: Non-Standard SQL.
I used this code in my Data Model just to test.
WITH FUNCTION GetValue1 (p_value VARCHAR2) Return VARCHAR2 IS
CURSOR c1 IS
SELECT 'aa' aa FROM dual WHERE p_value = 'ABC';
cc VARCHAR2(100);
BEGIN
FOR x IN c1
LOOP
cc := x.aa;
END LOOP;
RETURN cc;
EXCEPTION
WHEN OTHERS
THEN
RETURN 'Error GetValue1: '|| p_value;
END GetValue1;
------------
--Main Query
------------
SELECT GetValue1('ABC') GetValue
FROM DUAL
Cheers
Fernando
Thank you Fernando for taking the time to find the workaround. It works for me too
It is strange to see, the same query gets executed in normal run in the database, whereas in BIP we have to say Oracle's sql is a non standard sql
Regards,
Donald
Hi Donald.
No worries. It was an interesting learning. Never thought about using Function on WITH clause in BIP.
An old workmate once told me while running SQL on different tools.
"We have two pieces of software talking with the database. They make not talk the same way all the time"
Cheers
Fernando.
Good one, I will remember that, "We have two pieces of software...."
Regards,
Donald
Hi Donald.
Forgot about some options in the Data Model.
The following works.
Type of SQL: Non-Standard SQL.
I used this code in my Data Model just to test.
Cheers
Fernando