Avoid Hard Parsing for executing dynamic SQL using DUAL table Oracle
I want to know if dynamic sql statements involving DUAL table can be modified to remove HARD PARSING.
We have several SQL statements are stored in configuration table, here is sample example
-- query 1 before replacing index values as stored in config table ---
select count(*) from dual where 'REPLACE_VALUE_OF_INDEX_3' IN ('K')
AND (('REPLACE_VALUE_OF_INDEX_13' IN ('1053','1095','1199') ) OR ('REPLACE_VALUE_OF_INDEX_13' IN ('1200') ))
AND 'REPLACE_VALUE_OF_INDEX_2' IN ('6')
AND 'REPLACE_VALUE_OF_INDEX_15' IN ('870001305')
-- query 1 after replacing index values--
select count(*) from dual where 'REPLACE_VALUE_OF_INDEX_10' IN ('K')
AND (('1030' IN ('1053','1095','1199') ) OR ('1030' IN ('1200') ))
AND '2' IN ('6')
AND 'X' IN ('870001305')
-- query 2 before replacing index values as stored in config table --
select count(*) from dual where 'REPLACE_VALUE_OF_INDEX_5' IN ('361A','362A')
AND 'REPLACE_VALUE_OF_INDEX_22' BETWEEN '200707' AND '200806'
-- query 2 after replacing index values--
select count(*) from dual where '3MAA' IN ('361A','362A') AND '201304' BETWEEN '200707' AND '200806'
If I got it right you have some (maybe lots of) conditions stored in a table (be patient - it's my interpretation)
create table eb_conditions as
select 1 rid,q'{:5 IN ('361A','362A') AND :3 BETWEEN '200707' AND '200806'}' cndtn from dual union all
select 2,q'{:2 IN ('361A','362A') AND :3 BETWEEN '200707' AND '200806'}' from dual union all
select 3,q'{:1 IN ('K') AND ((:2 IN ('1053','1095','1199') ) OR (:4 IN ('1200') )) AND :3 IN ('6') AND :5 IN ('870001305')}' from dual
RID
CNDTN
1
:5 IN ('361A','362A') AND :3 BETWEEN '200707' AND '200806'
2
:2 IN ('361A','362A') AND :3 BETWEEN '200707' AND '200806'
3
:1 IN ('K') AND ((:2 IN ('1053','1095','1199') ) OR (:4 IN ('1200') )) AND :3 IN ('6') AND :5 IN ('870001305')
and you have to check the conditions using values stored in an array
I used a table instead: the vl at rid = 1 representing the value of bind variable :1 in eb_conditions table and so on ...
create table eb_array as
select 1 rid,'K' vl from dual union all
select 2,'1199' from dual union all
select 3,'200803' from dual union all
select 4,'1000' from dual union all
select 5,'870001305' from dual
RID
VL
1
K
2
1199
3
200803
4
1000
5
870001305
You want to check the conditions using select count(*) from dual where <condition with binds substituted fron the array>
Judging from the title Hard Parsing represents the major problem and you cannot avoid it since every condition to be verified is different from every other condition.
I think your best bet is not to evaluate conditions row by row - context shift cannot be avoided and there might be more than one for each iteration.
So try to do it in a single step:
declare
w_cndtn varchar2(4000);
w_clob clob;
w_cursor sys_refcursor;
one number;
two number;
begin
dbms_lob.createtemporary(w_clob,false);
for rw in (select rid,
max(cndtn) cndtn,
listagg(val,',') within group (order by rn)||',' usng
from (select c.rid,c.cndtn,c.rn,c.bind,
replace(rtrim(c.bind),':'||to_char(v.rid),''''||v.vl||'''') val
from (select rid,
cndtn,
regexp_substr(cndtn,':\d+ ',1,level) bind,
level rn
from eb_conditions
connect by level <= regexp_count(cndtn,':')
and prior rid = rid
and prior sys_guid() is not null
) c,
eb_array v
where instr(c.bind,':'||v.rid||' ') > 0
group by rid
loop
w_cndtn := rw.cndtn;
while instr(w_cndtn,':') > 0
loop
w_cndtn := replace(w_cndtn,trim(regexp_substr(w_cndtn,':\d+ ',1,1)),substr(rw.usng,1,instr(rw.usng,',') - 1));
rw.usng := substr(rw.usng,instr(rw.usng,',') + 1);
end loop;
w_cndtn := 'select '||to_char(rw.rid)||' cndtn_id,count(*) from dual where '||w_cndtn||' union all ';
w_clob := w_clob ||' '||w_cndtn;
end loop;
w_clob := substr(w_clob,1,instr(w_clob,'union all',-1,1) - 1);
open w_cursor for w_clob;
loop
fetch w_cursor into one,two;
exit when w_cursor%notfound;
dbms_output.put_line(to_char(one)||':'||to_char(two));
end loop;
dbms_lob.freetemporary(w_clob);
end;
1:0
2:0
3:0
Statement processed.
Regards
Etbin
Similar Messages
-
How to use bind variable in the query to avoid hard parsing
Hi,
I have a query which is using literals
strquery:='SELECT SUMTOTAL FROM tab1 WHERE BATCHNO = '''
|| gBNo
|| ''' AND A_ID = '''
|| g_id
|| ''' AND L_ID = '''
|| g_LId
|| ''' AND S_Code = ''C_3'' ';
execute immediate strquery;I have been asked to use a bind variable to avoid hard parsing.
How do i do it?
Edited by: user8731258 on Jul 27, 2012 5:07 AM
Edited by: user8731258 on Jul 27, 2012 5:08 AMYou dont need Dynamic SQL. Your Table and Column Name are static in that query. Just use Static SQL
SELECT SUMTOTAL
INTO lSumTotal
FROM tab1
WHERE BATCHNO = gBatchNo
AND ATM_ID = gAtm_id
AND LOAD_ID = gLoadId
AND STEP_CODE = 'C_3'; -
Error while parsing or executing XML-SQL document
friends,
my scenario is based on file to jdbc.i am facing an error in receiver CC in RWB.
The error states that '
Error while parsing or executing XML-SQL document: Error processing request in sax parser: Error when executing statement for table/stored proc. 'MATMAS' (structure 'STATEMENT'): java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]String or binary data would be truncated.'
My SOAP xml message is
- <SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
- <SOAP:Header>
- <sap:Main xmlns:sap="http://sap.com/xi/XI/Message/30" versionMajor="3" versionMinor="0" SOAP:mustUnderstand="1" xmlns:wsu="http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="wsuid-main-92ABE13F5C59AB7FE10000000A1551F7">
<sap:MessageClass>ApplicationMessage</sap:MessageClass>
<sap:ProcessingMode>asynchronous</sap:ProcessingMode>
<sap:MessageId>18f17dd0-d503-11dc-cb4d-001635b02bfd</sap:MessageId>
<sap:TimeSent>2008-02-06T22:30:21Z</sap:TimeSent>
- <sap:Sender>
<sap:Party agency="http://sap.com/xi/XI" scheme="XIParty" />
<sap:Service>ECC</sap:Service>
</sap:Sender>
- <sap:Receiver>
<sap:Party agency="http://sap.com/xi/XI" scheme="XIParty" />
<sap:Service>BS_JDBC</sap:Service>
</sap:Receiver>
<sap:Interface namespace="http://file_to_jdbc">MI_JDBC_RECEIVER</sap:Interface>
</sap:Main>
- <sap:ReliableMessaging xmlns:sap="http://sap.com/xi/XI/Message/30" SOAP:mustUnderstand="1">
<sap:QualityOfService>ExactlyOnce</sap:QualityOfService>
</sap:ReliableMessaging>
- <sap:DynamicConfiguration xmlns:sap="http://sap.com/xi/XI/Message/30" SOAP:mustUnderstand="1">
<sap:Record namespace="http://sap.com/xi/XI/System/File" name="Directory">
sapecc50\sapmnt\trans</sap:Record>
<sap:Record namespace="http://sap.com/xi/XI/System/File" name="FileEncoding">UTF-8</sap:Record>
<sap:Record namespace="http://sap.com/xi/XI/System/File" name="FileType">txt</sap:Record>
<sap:Record namespace="http://sap.com/xi/XI/System/File" name="FileName">matmas1.txt</sap:Record>
</sap:DynamicConfiguration>
- <sap:HopList xmlns:sap="http://sap.com/xi/XI/Message/30" SOAP:mustUnderstand="1">
- <sap:Hop timeStamp="2008-02-06T22:30:21Z" wasRead="false">
<sap:Engine type="AE">af.e6e.sapecc6eval</sap:Engine>
<sap:Adapter namespace="http://sap.com/xi/XI/System">XIRA</sap:Adapter>
<sap:MessageId>18f17dd0-d503-11dc-cb4d-001635b02bfd</sap:MessageId>
<sap:Info />
</sap:Hop>
- <sap:Hop timeStamp="2008-02-06T22:30:21Z" wasRead="false">
<sap:Engine type="IS">is.01.sapecc6eval</sap:Engine>
<sap:Adapter namespace="http://sap.com/xi/XI/System">XI</sap:Adapter>
<sap:MessageId>18f17dd0-d503-11dc-cb4d-001635b02bfd</sap:MessageId>
<sap:Info>3.0</sap:Info>
</sap:Hop>
- <sap:Hop timeStamp="2008-02-06T22:30:22Z" wasRead="false">
<sap:Engine type="AE">af.e6e.sapecc6eval</sap:Engine>
<sap:Adapter namespace="http://sap.com/xi/XI/System">XIRA</sap:Adapter>
<sap:MessageId>18f17dd0-d503-11dc-cb4d-001635b02bfd</sap:MessageId>
</sap:Hop>
</sap:HopList>
- <sap:Diagnostic xmlns:sap="http://sap.com/xi/XI/Message/30" SOAP:mustUnderstand="1">
<sap:TraceLevel>Information</sap:TraceLevel>
<sap:Logging>Off</sap:Logging>
</sap:Diagnostic>
</SOAP:Header>
- <SOAP:Body>
- <sap:Manifest xmlns:sap="http://sap.com/xi/XI/Message/30" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wsu="http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="wsuid-manifest-5CABE13F5C59AB7FE10000000A1551F7">
- <sap:Payload xlink:type="simple" xlink:href="cid:[email protected]">
<sap:Name>MainDocument</sap:Name>
<sap:Description />
<sap:Type>Application</sap:Type>
</sap:Payload>
</sap:Manifest>
</SOAP:Body>
</SOAP:Envelope>
and payload message is
<?xml version="1.0" encoding="UTF-8" ?>
- <ns0:MT_JDBC_RECEIVER xmlns:ns0="http://file_to_jdbc">
- <STATEMENT>
- <ROW action="INSERT">
<TABLE>MATMAS</TABLE>
- <access>
<MATNR>38</MATNR>
<MTART>HALB</MTART>
<MATKL>00107</MATKL>
<MEINS>pc</MEINS>
<ERSDA>2008.04.05</ERSDA>
<BRGEW>10</BRGEW>
<NTGEW>12</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>88</MATNR>
<MTART>FERT</MTART>
<MATKL>02004</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2008.04.05</ERSDA>
<BRGEW>12</BRGEW>
<NTGEW>13</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>89</MATNR>
<MTART>FERT</MTART>
<MATKL>02004</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2008.03.02</ERSDA>
<BRGEW>12</BRGEW>
<NTGEW>14</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>98</MATNR>
<MTART>HALB</MTART>
<MATKL>2</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2006.09.01</ERSDA>
<BRGEW>12</BRGEW>
<NTGEW>12</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>170</MATNR>
<MTART>NLAG</MTART>
<MATKL>4</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2005.03.02</ERSDA>
<BRGEW>2</BRGEW>
<NTGEW>3</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>178</MATNR>
<MTART>NLAG</MTART>
<MATKL>4</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2007.03.06</ERSDA>
<BRGEW>3</BRGEW>
<NTGEW>4</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>188</MATNR>
<MTART>NLAG</MTART>
<MATKL>5</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2007.05.02</ERSDA>
<BRGEW>2</BRGEW>
<NTGEW>3</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>288</MATNR>
<MTART>HALB</MTART>
<MATKL>101</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2006.02.11</ERSDA>
<BRGEW>5</BRGEW>
<NTGEW>4</NTGEW>
<GEWEI>KG</GEWEI>
</access>
- <access>
<MATNR>358</MATNR>
<MTART>HAWA</MTART>
<MATKL>2</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2007.09.09</ERSDA>
<BRGEW>500</BRGEW>
<NTGEW>500</NTGEW>
<GEWEI>G</GEWEI>
</access>
- <access>
<MATNR>359</MATNR>
<MTART>HAWA</MTART>
<MATKL>2</MATKL>
<MEINS>PC</MEINS>
<ERSDA>2007.08.01</ERSDA>
<BRGEW>20</BRGEW>
<NTGEW>10</NTGEW>
<GEWEI>G</GEWEI>
</access>
</ROW>
</STATEMENT>
</ns0:MT_JDBC_RECEIVER>
Could anybody help me in sorting out this issue.My advance thankshi,
ypur structure is bad defined.
if you want to do an insert, the DT should be
<ns0:MT_JDBC_RECEIVER xmlns:ns0="http://file_to_jdbc">
___<StatementName>
______<dbTableName action=INSERT>
_____<table>MATMAS</table>
_______ <access>
___________<MATNR>38</MATNR>
___________<MTART>HALB</MTART>
___________<MATKL>00107</MATKL>
___________<MEINS>pc</MEINS>
___________<ERSDA>2008.04.05</ERSDA>
___________<BRGEW>10</BRGEW>
___________<NTGEW>12</NTGEW>
___________<GEWEI>KG</GEWEI>
______</access>
_____</dbTableName>
__ </StatementName>
</ns0:MT_JDBC_RECEIVER>
the ROW field is used when you wait receive data from DB for example you execute and SQL Query from Sender communication channel "SELECT name FROM TABLE Names"
so, the result of this query would be, for example:
<row>
____<name>joge</name>
</row>
<row>
____<name>pepe</name>
</row>
<row>
____<name>nicola</name>
</row>
See this link
http://help.sap.com/saphelp_nw04/helpdata/en/2e/96fd3f2d14e869e10000000a155106/frameset.htm
Thanks
Rodrigo
Edited by: Rodrigo Pertierra on Feb 8, 2008 8:40 AM
Edited by: Rodrigo Pertierra on Feb 8, 2008 8:42 AM -
Error while parsing or executing XML-SQL document attribute "action" missin
Hi All,
I am doing a scenario for IDOC to JDBC, When I push IDOC from R/3 , IDOC sent to XI System successfully,
I have also checked in SXMB_MONI it is showing the successful staus without any errors, and I have also copied the xml structure from main document of payloads and tested the mapping in Integration Designer, and it is showing successfull message.
here is the xml structure from payloads of Request Message Mapping ........
<?xml version="1.0" encoding="UTF-8" ?>
- <ns0:RTACOGRP_RECEIVER_MT xmlns:ns0="http://prospecta.com/wsorta/cosmas/idoc2jdbc">
- <COGRP_TMP_PROC action="EXECUTE">
<IDOCNUMBER isInput="TRUE" type="CHAR">1000001</IDOCNUMBER>
<E1COGH_NUMBER isInput="TRUE" type="CHAR">1</E1COGH_NUMBER>
<E1COGH_HIGHERSEGMENT isInput="TRUE" type="CHAR">1</E1COGH_HIGHERSEGMENT>
<E1COGH_MSGFN isInput="TRUE" type="CHAR">1</E1COGH_MSGFN>
<E1COGH_GROUPTYPE isInput="TRUE" type="CHAR">1</E1COGH_GROUPTYPE>
<E1COGH_GROUPNAME isInput="TRUE" type="CHAR">1</E1COGH_GROUPNAME>
<E1COGH_KOKRS isInput="TRUE" type="CHAR">1</E1COGH_KOKRS>
<E1COGHT_NUMBER isInput="TRUE" type="CHAR">1</E1COGHT_NUMBER>
<E1COGHT_HIGHERSEGMENT isInput="TRUE" type="CHAR">2</E1COGHT_HIGHERSEGMENT>
<E1COGHT_LANGU isInput="TRUE" type="CHAR">2</E1COGHT_LANGU>
<E1COGHT_DESCRIPT isInput="TRUE" type="CHAR">2</E1COGHT_DESCRIPT>
<E1COGHT_LANGU_ISO isInput="TRUE" type="CHAR">2</E1COGHT_LANGU_ISO>
<E1COGV_NUMBER isInput="TRUE" type="CHAR">1</E1COGV_NUMBER>
<E1COGV_HIGHERSEGMENT isInput="TRUE" type="CHAR">3</E1COGV_HIGHERSEGMENT>
<E1COGV_FROMVALUE isInput="TRUE" type="CHAR">6</E1COGV_FROMVALUE>
<E1COGV_TOVALUE isInput="TRUE" type="CHAR">6</E1COGV_TOVALUE>
<E1COGS_NUMBER isInput="TRUE" type="CHAR">1</E1COGS_NUMBER>
<E1COGS_HIGHERSEGMENT isInput="TRUE" type="CHAR">5</E1COGS_HIGHERSEGMENT>
<E1COGS_SUBGROUP isInput="TRUE" type="CHAR">4</E1COGS_SUBGROUP>
<E1COGHR_NUMBER isInput="TRUE" type="CHAR">1</E1COGHR_NUMBER>
<E1COGHR_HIGHERSEGMENT isInput="TRUE" type="CHAR">6</E1COGHR_HIGHERSEGMENT>
<E1COGHR_SNAME isInput="TRUE" type="CHAR">3</E1COGHR_SNAME>
<E1COGHR_PRTCLASS isInput="TRUE" type="CHAR">3</E1COGHR_PRTCLASS>
<E1COGHR_AUTHGR isInput="TRUE" type="CHAR">3</E1COGHR_AUTHGR>
<E1COGSR_NUMBER isInput="TRUE" type="CHAR">1</E1COGSR_NUMBER>
<E1COGSR_HIGHERSEGMENT isInput="TRUE" type="CHAR">7</E1COGSR_HIGHERSEGMENT>
<E1COGSR_XSUPPRESS isInput="TRUE" type="CHAR">5</E1COGSR_XSUPPRESS>
<E1COGSR_PRTCLASS isInput="TRUE" type="CHAR">5</E1COGSR_PRTCLASS>
<E1COGSR_LNAME isInput="TRUE" type="CHAR">5</E1COGSR_LNAME>
<E1COGVT_NUMBER isInput="TRUE" type="CHAR">1</E1COGVT_NUMBER>
<E1COGVT_HIGHERSEGMENT isInput="TRUE" type="CHAR">9</E1COGVT_HIGHERSEGMENT>
<E1COGVT_LANGU isInput="TRUE" type="CHAR">7</E1COGVT_LANGU>
<E1COGVT_DESCRIPT isInput="TRUE" type="CHAR">7</E1COGVT_DESCRIPT>
<E1COGVT_LANGU_ISO isInput="TRUE" type="CHAR">7</E1COGVT_LANGU_ISO>
<E1COGVR_NUMBER isInput="TRUE" type="CHAR">1</E1COGVR_NUMBER>
<E1COGVR_HIGHERSEGMENT isInput="TRUE" type="CHAR">12</E1COGVR_HIGHERSEGMENT>
<E1COGVR_XSUPPRESS isInput="TRUE" type="CHAR">8</E1COGVR_XSUPPRESS>
<E1COGVR_PRTCLASS isInput="TRUE" type="CHAR">8</E1COGVR_PRTCLASS>
<E1COGVR_LNAME isInput="TRUE" type="CHAR">8</E1COGVR_LNAME>
</COGRP_TMP_PROC>
</ns0:RTACOGRP_RECEIVER_MT>
When I checked for component monitoring in runtime workbench....
these are the messages........
<i>Error while parsing or executing XML-SQL document: Error processing request in sax parser: No 'action' attribute found in XML document (attribute "action" missing or wrong XML structure)</i>
Here are the messages from message monitoring ......
2007-06-07 12:42:17 Success Receiver JDBC adapter: processing started; QoS required: ExactlyOnce
2007-06-07 12:42:17 Success JDBC adapter receiver channel RTACOGRP_COM_Chan: processing started; party , service WSORTABS
2007-06-07 12:42:17 Error No "action" attribute found in XML document ("action" attribute missing or wrong XML structure)
2007-06-07 12:42:17 Error MP: exception caught with cause com.sap.aii.af.ra.ms.api.RecoverableException: Error processing request in sax parser: No 'action' attribute found in XML document (attribute "action" missing or wrong XML structure)
2007-06-07 12:42:17 Error Exception caught by adapter framework: Error processing request in sax parser: No 'action' attribute found in XML document (attribute "action" missing or wrong XML structure)
2007-06-07 12:42:17 Error Delivery of the message to the application using connection JDBC_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Error processing request in sax parser: No 'action' attribute found in XML document (attribute "action" missing or wrong XML structure).
2007-06-07 12:42:17 Error The message status set to NDLV.
Can any body please resolve the problem.....
Thanks in Advance
MurthyBhavesh,
Now I have changed the data structure , and the resultant structure is like this...
<?xml version="1.0" encoding="UTF-8" ?>
- <ns0:RTACOGRP_RECEIVER_MT xmlns:ns0="http://prospecta.com/wsorta/cosmas/idoc2jdbc">
- <Statement>
- <COGRP_TMP_PROC action="EXECUTE">
<IDOCNUMBER isInput="TRUE" type="CHAR">100002223</IDOCNUMBER>
<E1COGH_NUMBER isInput="TRUE" type="CHAR">1</E1COGH_NUMBER>
<E1COGH_HIGHERSEGMENT isInput="TRUE" type="CHAR">1</E1COGH_HIGHERSEGMENT>
<E1COGH_MSGFN isInput="TRUE" type="CHAR">H</E1COGH_MSGFN>
<E1COGH_GROUPTYPE isInput="TRUE" type="CHAR">H</E1COGH_GROUPTYPE>
<E1COGH_GROUPNAME isInput="TRUE" type="CHAR">H</E1COGH_GROUPNAME>
<E1COGH_KOKRS isInput="TRUE" type="CHAR">H</E1COGH_KOKRS>
<E1COGHT_NUMBER isInput="TRUE" type="CHAR">1</E1COGHT_NUMBER>
<E1COGHT_HIGHERSEGMENT isInput="TRUE" type="CHAR">2</E1COGHT_HIGHERSEGMENT>
<E1COGHT_LANGU isInput="TRUE" type="CHAR">T</E1COGHT_LANGU>
<E1COGHT_DESCRIPT isInput="TRUE" type="CHAR">T</E1COGHT_DESCRIPT>
<E1COGHT_LANGU_ISO isInput="TRUE" type="CHAR">T</E1COGHT_LANGU_ISO>
<E1COGV_NUMBER isInput="TRUE" type="CHAR">1</E1COGV_NUMBER>
<E1COGV_HIGHERSEGMENT isInput="TRUE" type="CHAR">3</E1COGV_HIGHERSEGMENT>
<E1COGV_FROMVALUE isInput="TRUE" type="CHAR">V</E1COGV_FROMVALUE>
<E1COGV_TOVALUE isInput="TRUE" type="CHAR">V</E1COGV_TOVALUE>
<E1COGS_NUMBER isInput="TRUE" type="CHAR">1</E1COGS_NUMBER>
<E1COGS_HIGHERSEGMENT isInput="TRUE" type="CHAR">5</E1COGS_HIGHERSEGMENT>
<E1COGS_SUBGROUP isInput="TRUE" type="CHAR">S</E1COGS_SUBGROUP>
<E1COGHR_NUMBER isInput="TRUE" type="CHAR">1</E1COGHR_NUMBER>
<E1COGHR_HIGHERSEGMENT isInput="TRUE" type="CHAR">7</E1COGHR_HIGHERSEGMENT>
<E1COGHR_SNAME isInput="TRUE" type="CHAR">R</E1COGHR_SNAME>
<E1COGHR_PRTCLASS isInput="TRUE" type="CHAR">R</E1COGHR_PRTCLASS>
<E1COGHR_AUTHGR isInput="TRUE" type="CHAR">R</E1COGHR_AUTHGR>
<E1COGSR_NUMBER isInput="TRUE" type="CHAR">1</E1COGSR_NUMBER>
<E1COGSR_HIGHERSEGMENT isInput="TRUE" type="CHAR">8</E1COGSR_HIGHERSEGMENT>
<E1COGSR_XSUPPRESS isInput="TRUE" type="CHAR">S</E1COGSR_XSUPPRESS>
<E1COGSR_PRTCLASS isInput="TRUE" type="CHAR">S</E1COGSR_PRTCLASS>
<E1COGSR_LNAME isInput="TRUE" type="CHAR">S</E1COGSR_LNAME>
<E1COGVT_NUMBER isInput="TRUE" type="CHAR">1</E1COGVT_NUMBER>
<E1COGVT_HIGHERSEGMENT isInput="TRUE" type="CHAR">10</E1COGVT_HIGHERSEGMENT>
<E1COGVT_LANGU isInput="TRUE" type="CHAR">T</E1COGVT_LANGU>
<E1COGVT_DESCRIPT isInput="TRUE" type="CHAR">T</E1COGVT_DESCRIPT>
<E1COGVT_LANGU_ISO isInput="TRUE" type="CHAR">T</E1COGVT_LANGU_ISO>
<E1COGVR_NUMBER isInput="TRUE" type="CHAR">1</E1COGVR_NUMBER>
<E1COGVR_HIGHERSEGMENT isInput="TRUE" type="CHAR">11</E1COGVR_HIGHERSEGMENT>
<E1COGVR_XSUPPRESS isInput="TRUE" type="CHAR">E</E1COGVR_XSUPPRESS>
<E1COGVR_PRTCLASS isInput="TRUE" type="CHAR">E</E1COGVR_PRTCLASS>
<E1COGVR_LNAME isInput="TRUE" type="CHAR">E</E1COGVR_LNAME>
</COGRP_TMP_PROC>
</Statement>
</ns0:RTACOGRP_RECEIVER_MT>
Now in message monitoring error is showing like this...
<i>Error while parsing or executing XML-SQL document: Error processing request in sax parser: Error when executing statement for table/stored proc. 'COGRP_TMP_PROC' (structure 'Statement'): java.sql.SQLException: General error</i>
Now in Component Monitoring error is showing like this....
<i>Delivery of the message to the application using connection JDBC_http://sap.com/xi/XI/System failed, due to: com.sap.aii.af.ra.ms.api.RecoverableException: Error processing request in sax parser: Error when executing statement for table/stored proc. 'COGRP_TMP_PROC' (structure 'Statement'): java.sql.SQLException: General error</i>
I have tested the stored procedure in sql by giving the same values , it was successfully executed..
Can you please tell me where is the error still in structure ...
Thanks in Advance,
Murthy. -
Error in executing dynamic SQL
i am getting error in executing dynamic SQL
declare
vr_RenewService NUMBER(10,0);
vr_sql VARCHAR2(50);
begin
vr_sql:='Select Case
when 5 <= 365 Then 1
When 1= 0 Then 1
else 0 end into' || TO_CHAR(vr_RenewService) || 'from dual;';
execute immediate vr_sql;
--dbms_output.put_line(vr_RenewService);
end;
ERROR
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 6
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause:
*Action:i too have tried this before you posted this solution but getting error message
declare
vr_RenewService NUMBER(10,0);
vr_sql VARCHAR2(100);
begin
vr_sql:='Select Case
when 5 <= 365 Then 1
When 1= 0 Then 1
else 0 end from dual;';
execute immediate vr_sql into vr_RenewService;
--dbms_output.put_line(vr_RenewService);
end;
ORA-06512: at line 11
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action: -
How can I execute Dynamic SQL statement in Forms?
Hi All,
I have to execute dynamic SQL statement from Forms
Below statement I have to execute
"EXECUTE IMMEDIATE v_stmt INTO v_return;".
Googled for the same got results saying, Better use Database function or procedures to execute these Dynamic Statements but We want to execute in forms only.
Can any one help me..
Thanks,
MadhuSo in short you are trading code obfuscation for maintainability and the ability to share code between tools? If from somewhere else you need a procedure already implemented in database PL/SQL (and now ported to forms) this would mean you'd need to implement it in every other tool. In times where you might want to integrate your forms with $other_technology and putting stuff on the database is the first step to share functionality you just go the opposite way? And all that because someone is afraid that somebody might steal your source code? I am sorry to be blunt, but this is just plain stupid.
Leaving aside that some things like Analytic Functions, Bulk processing or execute immediate are not even available in forms your software consists of how many LOC? How long does it take to bring a new developer up to speed with your source code? Imagine how long that would take for a developer who doesn't have coleagues who know their way around.
And just so you know: I work for a ISV selling a closed-source product as well. We have 200+ customers all over the planet. We are well aware that wrapped packages can be reverse engineered. The premise is: stored procedures can be reused in every tool we have, if it makes sense to put stuff on the database by all means do it. If someone would want to reverse engineer our software I'd wish him good luck as some parts are implemented in such a hilarious complicated way I have troubles understanding them (and quite frankly I refuse to understand certain parts, but that's another story). I do work for almost 10 years for that ISV.
In any case the possible solutions have already been mentioned: you have exec_sql, create_group_from_query and forms_ddl to execute dynamic SQL in forms whereas forms_ddl is a one way street and most certainly not the thing you need or want. Take a look at the documentation for the other 2 things.
cheers -
How to get the list of values for a dynamic parameter using Web Services SDK?
<p>I am struggling to get the list of values for a dynamic parameter of a report.</p><p>I am using Java Web Services SDK ... I tried to use PromptInfo.getLOV().getValues() method but it does not work.</p><p>First of all ... is this possible (to get the list of values for a dynamic param) using Web Services?</p><p>Second of all, if this is possible, how should I do it ... it seems it works fine when running the report from CMC. It asks for DB logon info and after that it provides a list of values.</p><p>Thx </p>
<p>Your assumption is correct. We are trying to get the LOVs from the Crystal Report. I was not aware that this is not supported by Web Services SDK.</p><p>We used Web Services SDK to integrated the Crystal Reports in our web application. We implemented some basic actions for reports: schedule, view instances, run ad-hoc reports.</p><p>We encountered this problem when trying to run/schedule reports with dynamic parameters (a list of values from DB). We were unable to get the LOVs.</p><p>Please let me know if you can think of an alternative to look at.</p><p>Thanks a lot,</p><p>Catalin </p>
-
I have just upgraded from a Macbook to a Macbook Air. I have been using a iomega external hard drive for Time Machine, which use a Firewire. However, Macbook Air's do not have a Firewire port and i cannot find an adaptor anywhere. Can anyone help?? Thanks
There has never been a reliable firewire ---> USB adapter suitable for external high speed storage. This was a major issue when the MacBooks lost the firewire port a number of years ago (Apple subsequently brought it back).
The only high speed port on the Air is the ThunderBolt port. There are external ThunderBolt drive options out there, but they're somewhat more expensive than traditional USB/FireWire options. -
Dynamic security using Security table in SSAS Tabular model
Hi,
Platform : SSAS Tabular model (VS 2010)
I need to apply Dynamic security using Security table(manually created) in Tabular model, Need to apply filter for 2 tables. I am able to
create roles in Tabular model using USERNAME() and LOOKUP() function it worked fine. But the problem is when i am trying to give full access for a particular column and limit the access in other column, it is not working properly.
Please find below table and guide me where i am falling short. In the Security table wherever you find ALL it means full access.
Security table
Login Name
Dim_Country
Dim_Customer
DOMAIN\User1
ALL
2
User1 should see all countries but Only 2,4 Customers
DOMAIN\User1
ALL
4
DOMAIN\User2
2
ALL
User2 should see all customers but Only 2,3 countries
DOMAIN\User2
3
ALL
DOMAIN\User3
ALL
ALL
User3 should see all Customers and Countries
DOMAIN\User4
1
3
User4 should see 1 Country and 3 Customer
ALL - means NO restriction
Numeric values indicate the Dimension IDs
Do let me know if further explanations required.
Thanks,
SundarHi Sundar,
According to your description, you want to implement dynamic security using Security table in SQL Server Analysis Services Tabular model, right?
It is very common to have data security implementation in BI projects either at databases or Cubes and sometimes this security implementation and maintenance goes out of control due to the dynamic flow of business information. Here are some links which describe
dynamic security implementation at SSAS tabular model using an external security table, please see:
http://bipassion.wordpress.com/2012/10/01/ssas-tabular-dynamic-security/
http://www.bidn.com/blogs/ChrisSchmidt/ssas/4332/dynamic-security-in-tabular
Regards,
Charlie Liao
TechNet Community Support -
Is it possible to execute an application using threads in oracle db 11g?
Hi all, I would like to know if it is possible to execute an application using threads in oracle database 11g. Actualy, I would like to know if is is possible to execute a pl/sql program in a similar way as I run threads in a java application.
Thanks in advance.
Edited by: user4073561 on 24/11/2010 05:19In oracle there is parallel execution/servers,and this is analogy java threads.Refer
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/manproc006.htm -
How to use dual table in ODI in source side for nested queries?
Hi,
Any idea how to use dual table in source for more than once. I want to build a ODI interface for the following source query
SELECT ACTV_TYP.ACTV_TYP_SRC_CD, ACTV_TYP.ACTV_TYP, PORT_ACTV_TYP.PORT_ACTV_TYP_SRC_CD, PORT_ACTV_TYP.PORT_ACTV_TYP, SFT_DLT_STS.SFT_DLT_STS_SRC_CD, SFT_DLT_STS.SFT_DLT_STS
FROM
SELECT LOW_VALUE PORT_ACTV_TYP_SRC_CD, MEANING PORT_ACTV_TYP
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BRKR_PORTS'
AND COLUMN_NAME = 'WORK_PORT_TYPE') PORT_ACTV_TYP,
(SELECT LOW_VALUE SFT_DLT_STS_SRC_CD, MEANING SFT_DLT_STS
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BANKS'
AND COLUMN_NAME = 'REC_STATUS') SFT_DLT_STS,
(SELECT 1 ACTV_TYP_SRC_CD, '?????' ACTV_TYP FROM DUAL
UNION ALL
SELECT 2 ACTV_TYP_SRC_CD, '???????' ACTV_TYP FROM DUAL) ACTV_TYP
RegardsIf the below query is equivalent , it seems you don't need dual table at all , just default the values in the interface.
You are using dual tables to populate values ACTV_TYP.ACTV_TYP_SRC_CD, ACTV_TYP.ACTV_TYP values. Look at your query in the following manner :
SELECT '1', '?????', PORT_ACTV_TYP.PORT_ACTV_TYP_SRC_CD, PORT_ACTV_TYP.PORT_ACTV_TYP, SFT_DLT_STS.SFT_DLT_STS_SRC_CD, SFT_DLT_STS.SFT_DLT_STS
FROM
SELECT LOW_VALUE PORT_ACTV_TYP_SRC_CD, MEANING PORT_ACTV_TYP
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BRKR_PORTS'
AND COLUMN_NAME = 'WORK_PORT_TYPE') PORT_ACTV_TYP,
(SELECT LOW_VALUE SFT_DLT_STS_SRC_CD, MEANING SFT_DLT_STS
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BANKS'
AND COLUMN_NAME = 'REC_STATUS') SFT_DLT_STS
UNION
SELECT 2 , '??????', PORT_ACTV_TYP.PORT_ACTV_TYP_SRC_CD, PORT_ACTV_TYP.PORT_ACTV_TYP, SFT_DLT_STS.SFT_DLT_STS_SRC_CD, SFT_DLT_STS.SFT_DLT_STS
FROM
SELECT LOW_VALUE PORT_ACTV_TYP_SRC_CD, MEANING PORT_ACTV_TYP
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BRKR_PORTS'
AND COLUMN_NAME = 'WORK_PORT_TYPE') PORT_ACTV_TYP,
(SELECT LOW_VALUE SFT_DLT_STS_SRC_CD, MEANING SFT_DLT_STS
FROM CUSTOMS.DOMAIN_ALLOW_COLUMNS_VALUES
WHERE TABLE_NAME = 'BANKS'
AND COLUMN_NAME = 'REC_STATUS') SFT_DLT_STS
Now you can use dataset to make UNION. -
Execute Dynamic SQL statement using procedure builder
i want to execute a dynamic SQL statment using procedure builder not using forms
because my statement depending on a variable table name
i know that i can do that from forms using
FORMS_DDL('SQL_STAT');
but i wanna to use the procedure builder
which function i should use and how?
please explain in example if you don't mind.
thanksHi,
You can very well use DBMS_SQL Package supplied by Oracle for doing this.
Search for DBMS_SQL in OTN. You will get all info regarding this.
Regards.
<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">quote:</font><HR>Originally posted by itslul:
i want to execute a dynamic SQL statment using procedure builder not using forms
because my statement depending on a variable table name
i know that i can do that from forms using
FORMS_DDL('SQL_STAT');
but i wanna to use the procedure builder
which function i should use and how?
please explain in example if you don't mind.
thanks<HR></BLOCKQUOTE>
null -
How to use a collection type of bind variable for execute dynamic statement
Hi,
We have a case where we copy selective data from Schema A To Schema B in one oracle database. The copy is achieved by using
execute immediate 'insert into '||target_schema||'.tablea select * from '||from_schema||'.table a where a.id in (select test_id from '||from_schema||'.table c);';
This works fine it takes an average of 10 seconds to copy around 14 tables. We have a requirement to bring this time to 2 seconds. One observation has been the clause
"select test_id from '||from_schema||'.table c" in the above sql statement repeats for many inserts . Thus we were thinking to bulk fetch this set of tests ids and use a bind vatiable of collection type for the execute immediate clause. Any suggestions on how to achieve it?
Thanks,
Chandana>
One observation has been the clause
"select test_id from '||from_schema||'.table c" in the above sql statement repeats for many inserts
>
So what? Constructing a string for a table level insert and parsing it can't possibly be a performance problem. If you were creating a string in a loop to insert rows into a table by getting the data FROM a collection - that's a problem that keeps showing up in the forums.
I'm with bravid and Nikolay on this one. First find out which side, select/insert, the problem is on.
As they said you need to provide more information about the process.
And using collections for your use case is definitely not the thing to do.
1. How many rows are we talking about?
2. Are the rows being inserted into an empty table?
3. Are you running these queries during peak production hours or in a batch windows?
Tune the SELECT if the problem is on that side.
Post an execution plan for the SELECT part of a query you think should run faster.
SET SERVEROUTPUT ON
SET AUTOTRACE TRACEONLY
SQL> select * from emp;
Execution Plan
Plan hash value: 3956160932
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 14 | 546 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 546 | 3 (0)| 00:00:01 |
SQL>On the INSERT side you might be able to use bulk inserts
ALTER TABLE myTable NOLOGGING;
INSERT /*+ append */ INTO myTable . . .
ALTER TABLE myTable LOGGINGIf the insert tables are always reused you could just leave them as NOLOGGING. Since you can't recover bulk data you need to make sure to get a good backup after the loads if you need to recover the data from the logs rather than just reload it yourself. -
Using information from ItResource for executing custom sql in OIM 11g
I need executing a custom sql query using a connection of a ItResource. How can I get the instance of connection for to execute the sql query ? Someone have a idea of how i make this ? Help me ...
TksHashMap itAttribute = new HashMap();
itAttribute.put("IT Resources.Name","IT-DB01");
tcITResourceInstanceOperationsIntf itResource=null;
tcResultSet resItResKey;
resItResKey = itResource.findITResourceInstances(itAttribute);
long iTesourceKey = resItResKey.getLongValue("IT Resource.Key");
tcResultSet resItRes = itResource.getITResourceInstanceParameters(iTesourceKey);
Append following lines:-
HashMap<String, String> hashMap = new HashMap<String, String>();
int countResultGetITResourceInstanceParameters = resItRes .getRowCount();
for(int i = 0; i < countResultGetITResourceInstanceParameters; i++) {
resultGetITResourceInstanceParameters.goToRow(i);
hashMap.put(
resItRes .getStringValue(ZAPConstants.IT_RESOURCES_TYPE_PARAMETER_NAME),
resItRes .getStringValue(ZAPConstants.IT_RESOURCES_TYPE_PARAMETER_VALUE)
return hashMap; -
How to reduce Parse time in dynamic SQL
I'm using for a part of my code dynamic SQL with DBMS_SQL Package, this dynamic SQL code is located in a loop with say 1000 repeatations, if we trace the code we see that this sql statement is parsed 1000 times and this causes
a serios performance issue. If i convert this part of code into static PLSQL code , the statement is parsed only one time as expected. i would like
to know how i can resolve this problem in the dynamic SQL code.
Why in case of static SQL, despite it is inside the loop, it is parsed
only one time by ORACLE and in case of dynamic SQL as many as the upper limit of counter.
Why the ORACLE has different behaviour to parse them? Is there any way or trick
to force ORACLE to parse it only one time like static SQL?despite the open cursor is also inside the loop but oracle parse it only one time.That is because PL/SQL is caching your cursor and resuing it. With DBMS_SQL you are opening a new cursor area in the loop for each iteration (DBMS_SQL.OPEN_CURSOR).
what you need to do is open/parse once and bind the value each time through the loop:
DECLARE
expr VARCHAR2(1000);
check_cur PLS_INTEGER;
nDummy PLS_INTEGER;
nFetched PLS_INTEGER;
BEGIN
-- Open Cursor
check_cur := dbms_sql.open_cursor;
expr := 'select 1 from dual where ' || ':bindvar1 ' || '=' ||
' ''bindvar1'' ';
-- Parse Cursor
dbms_sql.parse(check_cur,
expr,
1);
FOR counter IN 1 .. 1000
LOOP
-- Define Column
DBMS_SQL.define_column(check_cur,
1,
1);
-- Do Binding
dbms_sql.bind_variable(check_cur,
':bindvar1',
'bindname1');
-- Execute Cursor
nDummy := DBMS_SQL.EXECUTE(check_cur);
-- Fetch Rows
nFetched := DBMS_SQL.fetch_rows(check_cur);
END LOOP;
-- Close Cursor
dbms_sql.close_cursor(check_cur);
END;
call count cpu elapsed disk query current rows
Parse 1 0.21 0.23 0 0 0 0
Execute 1000 0.11 0.10 0 0 0 0
Fetch 1000 0.03 0.01 0 0 0 0
total 2001 0.35 0.35 0 0 0 0
Maybe you are looking for
-
Remote speakers no longer show up in iTunes
I have recently had to send my DVD/surround-sound into the shop for repair. It used to play iTunes through Airport Express fine, but now I've tried hooking Airport up to both my TV and another stereo, but in both cases remote speakers no longer show
-
Every time I try to install Itunes I get an error message saying it is unable to start services and to verify that I have sufficient privileges. I am the administrator. I have tried everything I can think of. When I click the ingore option it does
-
i have the program below. I want to add in the ability to input data from the keyboard and still run the current thread. What do i do? Do i set the current thread as a background thread, then create another thread to handle keyboard input?? How do i
-
Bridge and displaying Sharpening in Camera Raw.
Hello Should the previews in Bridge CS5 and the slid show show sharpenig applied in Camera Raw? Mike Engles
-
Table control related...
Hi, My question is - how can I develop table control having three columns with only one column editable?