SQL in ODI procedure truncated while execution
My repsoitory is upgraded from Sunopsisv3 to ODI 10.1.x . I was trying to execute the package . There is a procedure with a SQL in it. While executing it works fine sometimes and sometimes it errors out saying Syntax error or table alias not found .When i look into the logs i see that the query is truncated as a result it failed.During success the query looks fine.
It is behaving in a wierd way. Is there any solution to fix this issue.
Thanks,
Gupta.
Hi,
Try use #:
begin
select ename from emp where empid=#empno;
proc1(#empno);
end;
character '#' replace variable with value in the source
Edited by: Uthred on Sep 9, 2008 11:43 AM
Edited by: Uthred on Sep 9, 2008 11:43 AM
Similar Messages
-
How to list all physical schemas in ODI procedure
Dear Experts,
I am trying a requirement which is to execute a set of sqls in all the schemas configured in ODI.
for example
1) I have four data servers/physical schemas configured in Physical Architecture under Oracle techonlogy.
2) Created corresponding 4 logical schemas for Oracle.
3) Mapped using two different contexts.
4) one context mapped two schemas and another mapped two other schemas.
now, I need to exeture the following sql for all the Oracle schemas mapped in context selected.
just for testing: select dummy from dual
I would like to execute this sql in ODI procedure for every schema mapped in the selected context in single execution.
Can any expert help me on this solution?
- RajaRaja,
I was actually talking about multiple ODI Step command rather than multiple procedure. What you are trying to achieve is difficult unless you specify the logical schema in ODI Procedure , becuase getInfo will throw Null pointer if we dont specify the logical schema ,
the getSchema needs Logical schema . The other way i can think query in work rep tables and get the schema name and pass it .
Any way in case your figure out without passing Logical schema . Please share with us , i would be interested in learning the trick . -
Error while execution ODI procedure : java.lang.NullPointerException
Hi,
I`m trying to execute a simple ODI procedure and I`m getting the following exception:
java.lang.NullPointerException
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execCollOrders(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSqlS.treatTaskTrt(SnpSessTaskSqlS.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java)
at com.sunopsis.dwg.cmd.DwgCommandScenario.treatCommand(DwgCommandScenario.java)
at com.sunopsis.dwg.cmd.DwgCommandBase.execute(DwgCommandBase.java)
at com.sunopsis.dwg.cmd.e.j(e.java)
at com.sunopsis.dwg.cmd.g.F(g.java)
at com.sunopsis.dwg.dbobj.SnpScen.a(SnpScen.java)
at com.sunopsis.dwg.dbobj.SnpScen.localExecuteSync(SnpScen.java)
at com.sunopsis.dwg.tools.StartScen.actionExecute(StartScen.java)
at com.sunopsis.dwg.function.SnpsFunctionBaseRepositoryConnected.execute(SnpsFunctionBaseRepositoryConnected.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execIntegratedFunction(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSqlS.treatTaskTrt(SnpSessTaskSqlS.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java)
at com.sunopsis.dwg.cmd.DwgCommandScenario.treatCommand(DwgCommandScenario.java)
at com.sunopsis.dwg.cmd.DwgCommandBase.execute(DwgCommandBase.java)
at com.sunopsis.dwg.cmd.e.j(e.java)
at com.sunopsis.dwg.cmd.g.z(g.java)
at com.sunopsis.dwg.cmd.e.run(e.java)
at java.lang.Thread.run(Thread.java:595)
The source of the procedure:
select
P_ID,
P_NAME,
to_char(START_TIME_KEY,'DD-MON-YYYY HH24:MI:SS') as START_TIME_KEY,
to_char(END_TIME_KEY,'DD-MON-YYYY HH24:MI:SS') as END_TIME_KEY,
P_IS_ACTIVE,
from persons
The target of the procedure:
DECLARE
v_START_TIME_KEY DATE;
v_END_TIME_KEY DATE;
v_NAME VARCHAR2(200);
v_ID NUMBER;
BEGIN
v_NAME := '#P_NAME';
commit;
END;
ODI version: 10.1.3.5.5
Source and target technology: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
Thanks!Hello,
Is your aim to get the Name from the table into the variable. ?
And if there is only one row from the table you can use refresh variable to get the name:
if there are more rows and you want to do somehthing repeatedly using the name, then you need to use the method you have described.
Declare the variable in the pakcage and give some default value to the variable then call the procedure.
Regards
Reshma -
Dynamic PL/SQL code into ODI Procedure
Hi guys:
I have a PL/SQL code to execute into a ODI proc that changes because of a loop.
I have to update N tables that have the same prefix and its sufix is the dynamic part of my PL/SQL. Also I have to set the DT_ETL (I already have a variable in my package with the sysdate) and the limit of a rownum.
These are my variables:
vGET_CD_BASE*
vQTD_REG_UPDATE*
vETL_DATE*
The PL/SQL is described below (with the dynamic parts of it as ODI variables #vXXXXX):
DECLARE
CURSOR v_Cur IS
SELECT ROWID KEY_ROW FROM GG_DATA.WRK_SN_DET_ITEM_EXTR_PARC_*#vGET_CD_BASE* WHERE DT_ETL = TO_DATE('01/01/1900','DD/MM/YYYY') and rownum < *#vQTD_REG_UPDATE*;
TYPE t_Tabela IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
r_Reg t_Tabela;
BEGIN
OPEN v_Cur;
LOOP
FETCH v_Cur BULK COLLECT INTO r_Reg LIMIT 100000;
FORALL i IN 1..r_Reg.COUNT
UPDATE GG_DATA.WRK_SN_DET_ITEM_EXTR_PARC_*#vGET_CD_BASE*
SET DT_ETL = TO_DATE('*#vETL_DATE*','DD/MM/YYYY HH24:MI:SS')
WHERE ROWID = r_Reg(i);
EXIT WHEN v_Cur%NOTFOUND;
COMMIT;
END LOOP;
CLOSE v_Cur;
COMMIT;
END;
What do I have to change to make this PL/SQL works in ODI Procedure?
Regards.
Luiz AraujoLuiz,
One way you could do is by using the "Command on Source" and "Command on Target" feature of an ODI procedure:
In Command on Source, you can write query like:
>
select vGET_CD_BASE, vQTD_REG_UPDATE, vETL_DATE from some_configuration_table_containing_n_rows
>
In Command on Target, you can write:
>
DECLARE
CURSOR v_Cur IS
SELECT ROWID KEY_ROW FROM GG_DATA.WRK_SN_DET_ITEM_EXTR_PARC_#vGET_CD_BASE WHERE DT_ETL = TO_DATE('01/01/1900','DD/MM/YYYY') and rownum < #vQTD_REG_UPDATE;
TYPE t_Tabela IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
r_Reg t_Tabela;
BEGIN
OPEN v_Cur;
LOOP
FETCH v_Cur BULK COLLECT INTO r_Reg LIMIT 100000;
FORALL i IN 1..r_Reg.COUNT
UPDATE GG_DATA.WRK_SN_DET_ITEM_EXTR_PARC_#vGET_CD_BASE
SET DT_ETL = TO_DATE('*#vETL_DATE*','DD/MM/YYYY HH24:MI:SS')
WHERE ROWID = r_Reg(i);
EXIT WHEN v_Cur%NOTFOUND;
COMMIT;
END LOOP;
CLOSE v_Cur;
COMMIT;
END;
>
So, for "n" records that are returned by the source query, your PL/SQL package will run "n" times, each time substituting the values of vGET_CD_BASE, vQTD_REG_UPDATE, vETL_DATE respectively. -
How to run dynamic SQL from an ODI procedure step
I am on ODI 11.1.1.6.4. From within an ODI IKM step I have no problem running a procedure step like the following which calls a pl/sql procedure to get SQL text then later runs that code. Is there anyway to do the same from within an ODI procedure? I've tried a couple of variations and can not seem to get the parsing levels to resolve within a procedure like they resolve from within a KM step.
<@
/* Setup Java variables */
String out_SQL = "";
try
java.sql.Connection sourceConnection = odiRef.getJDBCConnection("SRC");
String sqltxt = "{call set_sql(?)}";
java.sql.CallableStatement pstmt = sourceConnection.prepareCall(sqltxt);
try
pstmt.registerOutParameter( 1, java.sql.Types.VARCHAR);
pstmt.execute();
out_SQL = pstmt.getString(1);
catch(java.sql.SQLException ex)
errMessage = ex.getMessage();
errMessage = errMessage.replace("'","");
finally
pstmt.close();
catch(java.lang.Exception e)
errMessage = e.getMessage();
errMessage = errMessage.replace("'","");
@>
BEGIN
-- The SQL that I want to run
<@
out.println(out_SQL);
@>
-- Error handling
<@ if ( out_SQL.length() ==0 ) { @>
raise_application_error(-20101, '<@=errMessage@>');
<@ } else { @>
dbms_output.put_line('Successful.');
<@ } @>
END;
------Please understand that I know that I can do this all within PL/SQL -- I am explicitly doing it the way I have outlined because I want to better understand the parsing levels/behavior within ODI procedures and I want to understand why KMs steps behave differently.
Another observation -- putting this all within a pl/sql block prevents ODI from properly capturing insert/update/delete row counts like it would if it were running a SQL statement.
So the question remains -- is there a way to run a dynamic SQL statement in an ODI procedure where the SQL statement is generated from within an Oracle procedure call and then run as SQL within an ODI procedure step? Best would be if there is an example of how this can be done. -
Hello all,
I am getting this following error , when trying to load from files to Oracle (used this link as reference : http://john-goodwin.blogspot.com/2009/06/odi-series-processing-all-files-in.html)
ODI 11g 11.1.1.6
Database
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
any help would be greatly appreciated
7000 : null : java.sql.SQLException: ODI-40400: Invalid format description
java.sql.SQLException: ODI-40400: Invalid format description
at com.sunopsis.jdbc.driver.file.impl.metadata.MetaDataExtractor.buildTableDescFromRequestSQLExceptionOnly(MetaDataExtractor.java:479)
at com.sunopsis.jdbc.driver.file.FilePreparedStatement.buildGenericRow(FilePreparedStatement.java:75)
at com.sunopsis.jdbc.driver.file.FilePreparedStatement.<init>(FilePreparedStatement.java:57)
at com.sunopsis.jdbc.driver.file.FileConnection.prepareStatement(FileConnection.java:299)
at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.odi.core.datasource.dwgobject.support.OnConnectOnDisconnectDataSourceAdapter$OnDisconnectCommandExecutionHandler.invoke(OnConnectOnDisconnectDataSourceAdapter.java:200)
at $Proxy2.prepareStatement(Unknown Source)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.doInitializeStatement(SQLCommand.java:82)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.getStatement(SQLCommand.java:117)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.getBatchCommand(SQLCommand.java:329)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.processRecord(SQLCommand.java:137)
at oracle.odi.runtime.agent.execution.cmd.TextCommand.processRecord(TextCommand.java:1)
at oracle.odi.runtime.agent.execution.DataMovementTaskExecutionHandler.handleTask(DataMovementTaskExecutionHandler.java:86)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.processTask(SnpSessTaskSql.java:2913)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2625)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:561)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:464)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:2093)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$2.doAction(StartSessRequestProcessor.java:366)
at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:216)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.doProcessStartSessTask(StartSessRequestProcessor.java:300)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access$0(StartSessRequestProcessor.java:292)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:855)
at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:126)
at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:83)
at java.lang.Thread.run(Thread.java:662)Question2:
I am calling
OdiStartScen -SCEN_NAME=ALL_FILES -SCEN_VERSION=001 "-ACTIVITIES.CURRFILENAME=#LOADFILE"
in ODI procedure and when I execute I am getting this following error two
OdiStartScen -SCEN_NAME=ALL_FILES -SCEN_VERSION=001 "-ACTIVITIES.CURRFILENAME=#LOADFILE"
Exception getTargetTable("METADATA_DESC") : ODI-15081: There is no Target TableBoth these errors are happening the same procedure with two commandsHello,
I am getting the same error too. I am just trying to load simple (13 columns all number) txt to oracle table. My interface defination doesn't contain any transformation, filter or join.
7000 : null : java.sql.SQLException: ODI-40400: Invalid format description
java.sql.SQLException: ODI-40400: Invalid format description
at com.sunopsis.jdbc.driver.file.impl.metadata.MetaDataExtractor.buildTableDescFromRequestSQLExceptionOnly(MetaDataExtractor.java:479)
at com.sunopsis.jdbc.driver.file.FilePreparedStatement.<init>(FilePreparedStatement.java:62)
at com.sunopsis.jdbc.driver.file.FileConnection.prepareStatement(FileConnection.java:299)
at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.odi.core.datasource.dwgobject.support.OnConnectOnDisconnectDataSourceAdapter$OnDisconnectCommandExecutionHandler.invoke(OnConnectOnDisconnectDataSourceAdapter.java:200)
Source Code:
select
CITY_ID
C1_CITY_ID,
DISTRICT_ID
C2_DISTRICT_ID,
TOWNSHIP_ID
C3_TOWNSHIP_ID,
VILLAGE_ID
C4_VILLAGE_ID,
QUARTER_ID
C5_QUARTER_ID,
STREET_ID
C6_STREET_ID,
BUILDING_ID
C7_BUILDING_ID,
INDEPENDENTSECTION_ID
C8_INDEPENDENTSECTION_ID,
MATCH_LEVEL
C9_MATCH_LEVEL,
SERIAL_NUM_SEQ
C10_SERIAL_NUM_SEQ,
POLICY_NUM
C11_POLICY_NUM,
RENEWAL_NUM
C12_RENEWAL_NUM,
ADDRESS_NUM
C13_ADDRESS_NUM
from
TABLE
/*$$SNPS_START_KEYSNP$CRDWG_TABLESNP$CRTABLE_NAME=ADDRESS_HINT_FLSNP$CRLOAD_FILE=C:/temi/adress_hints.txtSNP$CRFILE_FORMAT=DSNP$CRFILE_SEP_FIELD=0x0009SNP$CRFILE_SEP_LINE=0x000D0x000ASNP$CRFILE_FIRST_ROW=1SNP$CRFILE_ENC_FIELD=SNP$CRFILE_DEC_SEP=SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=CITY_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=1SNP$CRLINE_OFFSET=1SNP$CRLENGTH=3SNP$CRSCALE=0SNP$CRPRECISION=3SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=DISTRICT_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=2SNP$CRLINE_OFFSET=4SNP$CRLENGTH=5SNP$CRSCALE=0SNP$CRPRECISION=5SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=TOWNSHIP_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=3SNP$CRLINE_OFFSET=9SNP$CRLENGTH=5SNP$CRSCALE=0SNP$CRPRECISION=5SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=VILLAGE_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=4SNP$CRLINE_OFFSET=14SNP$CRLENGTH=10SNP$CRSCALE=0SNP$CRPRECISION=10SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=QUARTER_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=5SNP$CRLINE_OFFSET=24SNP$CRLENGTH=10SNP$CRSCALE=0SNP$CRPRECISION=10SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=STREET_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=6SNP$CRLINE_OFFSET=34SNP$CRLENGTH=10SNP$CRSCALE=0SNP$CRPRECISION=10SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=BUILDING_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=7SNP$CRLINE_OFFSET=44SNP$CRLENGTH=15SNP$CRSCALE=0SNP$CRPRECISION=15SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=INDEPENDENTSECTION_IDSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=8SNP$CRLINE_OFFSET=59SNP$CRLENGTH=15SNP$CRSCALE=0SNP$CRPRECISION=15SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=MATCH_LEVELSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=9SNP$CRLINE_OFFSET=74SNP$CRLENGTH=2SNP$CRSCALE=0SNP$CRPRECISION=2SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=SERIAL_NUM_SEQSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=10SNP$CRLINE_OFFSET=76SNP$CRLENGTH=10SNP$CRSCALE=0SNP$CRPRECISION=10SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=POLICY_NUMSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=11SNP$CRLINE_OFFSET=86SNP$CRLENGTH=10SNP$CRSCALE=0SNP$CRPRECISION=10SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=RENEWAL_NUMSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=12SNP$CRLINE_OFFSET=96SNP$CRLENGTH=2SNP$CRSCALE=0SNP$CRPRECISION=2SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=ADDRESS_NUMSNP$CRTYPE_NAME=NUMERICSNP$CRORDER=13SNP$CRLINE_OFFSET=98SNP$CRLENGTH=20SNP$CRSCALE=0SNP$CRPRECISION=20SNP$CR$$SNPS_END_KEY*/
Target Code:
insert into DASK_DWH.C$_0ADDRESS_HINT
C1_CITY_ID,
C2_DISTRICT_ID,
C3_TOWNSHIP_ID,
C4_VILLAGE_ID,
C5_QUARTER_ID,
C6_STREET_ID,
C7_BUILDING_ID,
C8_INDEPENDENTSECTION_ID,
C9_MATCH_LEVEL,
C10_SERIAL_NUM_SEQ,
C11_POLICY_NUM,
C12_RENEWAL_NUM,
C13_ADDRESS_NUM
values
:C1_CITY_ID,
:C2_DISTRICT_ID,
:C3_TOWNSHIP_ID,
:C4_VILLAGE_ID,
:C5_QUARTER_ID,
:C6_STREET_ID,
:C7_BUILDING_ID,
:C8_INDEPENDENTSECTION_ID,
:C9_MATCH_LEVEL,
:C10_SERIAL_NUM_SEQ,
:C11_POLICY_NUM,
:C12_RENEWAL_NUM,
:C13_ADDRESS_NUM -
Isolation Levels in ODI procedures
Hi,
I have a package with 1 interfaces and 2 procedures which I want to configure in as one transactional unit
The package executes the following sequence
1. Interface loads data from the source to target table
2. Procedure updates a statuscode on the source table to S
3. Procedure updates target table sequence number, but the procedure contains a where clause which filter records to updates
based on records in the source table with statuscode = S.
Step 3's execution is dependent on update in step 2. These steps behave as expected and all units tests pass when I
leave the transaction porperty of the procedures as AutoCommit.
However I want the interface and packages to be executed as a transcational unit so I configued them as follows.
The 2 procedures are configured to execute in the same Transaction (Transaction 0) with Commit property as "No Commit".
I based this on other forum entries.
With this configuration my unit tests seem to fail, the 3 step does not result in any record being updated.
I think the issue may be related to the isolation levels on the procedures, so I then configured the procedure's "Transaction Isolation" property to be "Read Uncommited".
When I ran the test in ODI I got the following error below.
Can you let me know if what I am trying to do is possible ?. Can you have a number of procedures in a single transactional unit,
where uncommited changes carried out in the first procedure(not committed), can be read in subsequent steps within that same transactional unit.
I am current using ODI Repository: Development_ODI_D8B4A_RC5
Any feedback would be appreciated.
Thanks,
Breda
ODI-1226: Step UPD REVN LSM fails after 1 attempt(s).
ODI-1232: Procedure UPD REVN LSM execution fails.
ODI-1228: Task UPD REVN LSM (Procedure) fails on the target ORACLE connection SALES_IMP_DATA_SERVER.
Caused By: java.sql.SQLException: ODI-10068: SnpsConnection: Isolation level not supported
at com.sunopsis.sql.SnpsConnection.setTransactionIsolation(SnpsConnection.java:905)
at com.sunopsis.sql.SnpsConnection.changeIsolationLevel(SnpsConnection.java:329)
at com.sunopsis.dwg.dbobj.SnpSession.changeIsolationLevel(SnpSession.java:3519)
at com.sunopsis.dwg.dbobj.SnpSessTask.getDefaultDwgConnectConnection(SnpSessTask.java:518)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.getExecutor(SnpSessTaskSql.java:2936)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.processTask(SnpSessTaskSql.java:2878)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2602)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:546)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:461)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1736)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1591)
at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$2.doAction(StartScenRequestProcessor.java:568)
at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:224)
at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor.doProcessStartScenTask(StartScenRequestProcessor.java:489)
at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$StartScenTask.doExecute(StartScenRequestProcessor.java:1062)
at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:118)
at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$1.run(DefaultAgentTaskExecutor.java:49)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49)
at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor.executeAgentTask(DefaultAgentTaskExecutor.java:41)
at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor.doExecuteAgentTask(TaskExecutorAgentRequestProcessor.java:94)
at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor.process(TaskExecutorAgentRequestProcessor.java:85)
at oracle.odi.runtime.agent.RuntimeAgent.startScenario(RuntimeAgent.java:700)
at oracle.odi.runtime.agent.InternalRuntimeAgent.startScenario(InternalRuntimeAgent.java:52)
at com.sunopsis.dwg.tools.StartScen.startScenOnLocalAgent(StartScen.java:983)
at com.sunopsis.dwg.tools.StartScen.actionExecute(StartScen.java:245)
at com.sunopsis.dwg.function.SnpsFunctionBaseRepositoryConnected.execute(SnpsFunctionBaseRepos
Edited by: user807308 on 14-Jan-2011 01:04
Edited by: user807308 on 14-Jan-2011 01:04Similar issue has been discussed here:
Re: Transaction rollback...
Check that out -
ODI Procedure error log syntax
hi
I need to call an odi procedure and an error log needs to be stored on an error table.
I have created an ODI procedure and in command on source select Oracle as technology and the logical schema
here I put
DECLARE
ODI_VAR VARCHAR2(4000);
BEGIN
select ( '<%=odiRef.getPrevStepLog( "MESSAGE" )%>') into ODI_VAR from dual;
END;
and in target tab.
Insert into ERROR_LOG (TASK_NAME,ERROR_DESCRIPTION)
Values ('test','ODI_VAR');
AFTER executing I am getting the below error
900 : 42000 : java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement
java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:457)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:397)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)
at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:662)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:476)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:204)
at oracle.jdbc.driver.T4C8Odscrarr.doODNY(T4C8Odscrarr.java:101)
at oracle.jdbc.driver.T4CPreparedStatement.doDescribe(T4CPreparedStatement.java:848)
at oracle.jdbc.driver.OracleStatement.describe(OracleStatement.java:5331)
at oracle.jdbc.driver.OracleResultSetMetaData.<init>(OracleResultSetMetaData.java:58)
at oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:274)
at oracle.odi.runtime.agent.execution.sql.concurrent.FastJDBCRecordSet.<init>(FastJDBCRecordSet.java:73)
at oracle.odi.runtime.agent.execution.sql.SQLDataProvider.readData(SQLDataProvider.java:97)
at oracle.odi.runtime.agent.execution.sql.SQLDataProvider.readData(SQLDataProvider.java:1)
at oracle.odi.runtime.agent.execution.DataMovementTaskExecutionHandler.handleTask(DataMovementTaskExecutionHandler.java:67)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.processTask(SnpSessTaskSql.java:2906)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2609)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:537)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:453)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:1740)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$2.doAction(StartSessRequestProcessor.java:338)
at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:214)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.doProcessStartSessTask(StartSessRequestProcessor.java:272)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access$0(StartSessRequestProcessor.java:263)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:822)
at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:123)
at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:82)
at java.lang.Thread.run(Thread.java:662)
Please help me to resolve this issue.Hi,
Try like this :
Command on source :
select ( '<%=odiRef.getPrevStepLog( "MESSAGE" )%>') ODI_VAR from dual
Command on target:
Insert into ERROR_LOG (TASK_NAME,ERROR_DESCRIPTION)
Values ('test',:ODI_VAR)
Use the above syntax as it is....it should work.......... -
Hi Experts,
I have created following procedure and triyng to get column value by using rownum. When I run the scenario, I am getting following exception at ODI Procedure step. Can any one please help me on it
I have created loop package to fetch column value until loop end.
Please let me know if you are not clear my query
ODI Procedure:
begin
select a.eno into '#EMPNO' from (select rownum r,e.* from trg_emp_01 e) a where a.r=#Counter;
end;
#EMPNO variable created as alphanumeric datatype and
#Counter variable created as alphanumic datatype and it is assign with '1' value
Exception:
6550 : 65000 : java.sql.SQLException: ORA-06550: line 1, column 25:
PLS-00220: simple name required in this context
ORA-06550: line 1, column 28:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 1, column 7:
PL/SQL: SQL Statement ignored
java.sql.SQLException: ORA-06550: line 1, column 25:
PLS-00220: simple name required in this context
ORA-06550: line 1, column 28:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 1, column 7:
PL/SQL: SQL Statement ignored
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:316)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:282)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:639)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:185)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:633)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1086)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2984)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3057)
at com.sunopsis.sql.SnpsQuery.executeUpdate(SnpsQuery.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execSrcOrders(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSqlS.treatTaskTrt(SnpSessTaskSqlS.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java)
at com.sunopsis.dwg.cmd.DwgCommandScenario.treatCommand(DwgCommandScenario.java)
at com.sunopsis.dwg.cmd.DwgCommandBase.execute(DwgCommandBase.java)
at com.sunopsis.dwg.cmd.e.i(e.java)
at com.sunopsis.dwg.cmd.g.y(g.java)
at com.sunopsis.dwg.cmd.e.run(e.java)
at java.lang.Thread.run(Thread.java:595)
ODI Procedure:
begin
select a.eno into #EMPNO from (select rownum r,e.* from trg_emp_01 e) a where a.r=#Counter;
end;
Exception:
6550 : 65000 : java.sql.SQLException: ORA-06550: line 1, column 26:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 1, column 7:
PL/SQL: SQL Statement ignored
java.sql.SQLException: ORA-06550: line 1, column 26:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 1, column 7:
PL/SQL: SQL Statement ignored
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:316)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:282)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:639)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:185)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:633)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1086)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2984)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3057)
at com.sunopsis.sql.SnpsQuery.executeUpdate(SnpsQuery.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.execSrcOrders(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTaskTrt(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSqlS.treatTaskTrt(SnpSessTaskSqlS.java)
at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java)
at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java)
at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java)
at com.sunopsis.dwg.cmd.DwgCommandScenario.treatCommand(DwgCommandScenario.java)
at com.sunopsis.dwg.cmd.DwgCommandBase.execute(DwgCommandBase.java)
at com.sunopsis.dwg.cmd.e.i(e.java)
at com.sunopsis.dwg.cmd.g.y(g.java)
at com.sunopsis.dwg.cmd.e.run(e.java)
at java.lang.Thread.run(Thread.java:595)
Thanks
Phani
Edited by: Phanikanth on Jul 9, 2010 1:25 AM
Edited by: Phanikanth on Jul 9, 2010 2:08 AMGood point - In my case, these are single executable statements. These have been saved in ODI and executed successfully. Just no using my machine.
EXAMPLE 1------------
DECLARE
RetVal ;
I_STRING VARCHAR2(200);
BEGIN
I_STRING := '';
RetVal := XXX.PKG_XXX.SF_COMMA_TO_TABLE ( I_STRING );
COMMIT;
END;
EXAMPLE 2------------
SELECT C.COL1, B.COL2, B.COL3,TO_CHAR(B.EFFDT,'YYYY-MM-DD') COL4,B.COL5,B.COL6
FROM TABLE1 A, TABLE2 B, TABLE3 C
WHERE
and A.ID = 'XXX'
and a.setcntrlvalue = ' '
AND A.NAME = 'XXX'
AND A.EFFDT =
(SELECT MAX(A_ED.EFFDT) FROM TABLE1 A_ED
WHERE A.SETID = A_ED.SETID
AND A_ED.EFFDT <= SYSDATE)
AND B.EFFDT =
(SELECT MAX(B_ED.EFFDT) FROM TABLE2 B_ED
WHERE B.SETID = B_ED.SETID
AND B.ACCOUNT = B_ED.ACCOUNT
AND B_ED.EFFDT <= SYSDATE)
AND A.SETID = B.SETID
AND A.RANGE_FROM = A.RANGE_TO
AND B.ACCOUNT = A.RANGE_FROM
AND A.SETID = C.SETID
AND A.TREE_NAME = C.TREE_NAME
AND A.TREE_NODE_NUM = C.TREE_NODE_NUM
AND C.EFFDT =
(SELECT MAX(C_ED.EFFDT) FROM TABLE3 C_ED
WHERE C.SETID = C_ED.SETID
AND C_ED.EFFDT <= A.EFFDT)
------------------ -
How to use Update Statement in ODI Procedure
Hi,
How can I use an update statement inside an ODI procedure.
ThanksHi,
You do not need the BEGIN and END. ODI procedures are free text, so you can simply write your update statement, as you would in toad/sql developer etc etc. Just make sure you set the Technology and the logical schema. It is how ever best practice to also use the API:
<%=odiRef.getSchemaName("YOUR_LOGICAL_SCHEMA_NAME", "D")%>. to prefix tables. This way, you select data from different schema's in the same instance (as long a your user has the correct privs).
Cheers
Bos
Edited by: Bos on Jun 22, 2011 3:09 PM -
Using generic format for database links in ODI Procedures
Hi,
As in procedure we use
create table <%=odiRef.getSchemaName("Target Schema","D")%>.TABLE2 as
select * from <%=odiRef.getSchemaName("Staging Schema","D")%>.TABLE1
where Staging Database and Target Database are logical schemas which will associate to respective physical schema while execution so the above statement will become as
create table Target_Schema.TABLE2 as
select * from staging_Schema.TABLE1
I just wanted to know if there is any way by which i can apply samethings for Database Links also.
Like if i have statements
create table TABLE2@Target_Database as
select * from TABLE1@staging_Database
can i replace DB links like Target_Database and Staging_Database?
Help would be appreciated. :)
Thanks,
MaheshI am not entirely sure about the exact requirement.
Any way ..
1.
create 2 variable .
v_get_src_schema : select '<%=odiRef.getSchemaName("<your_src_logical_schema>","D")%>' from dual
v_get_tgt_schema : select '<%=odiRef.getSchemaName("<your_tgt_logical_schema>","D")%>' from dual
2.
2 more variable to get the required DBLink
v_SRC_DB_LINK: select DB_LINK from all_db_links where owner='#PRJ_CODE.v_get_src_schema'
v_TGT_DB_LINK: select DB_LINK from all_db_links where owner='#PRJ_CODE.v_get_tgt_schema'
3.
create a procedure :
prc_create_table :
create table <%=odiRef.getSchemaName("Target Schema","D")%>.TABLE2@'#PRJ_CODE.v_TGT_DB_LINK' as
select * from <%=odiRef.getSchemaName("Staging Schema","D")%>.TABLE1@'#PRJ_CODE.v_SRC_DB_LINK'
4.
Create a package :
Connect all the steps in serial with OK line.
Execute and let us know what is the out come .
Thanks,
Sutirtha -
ODI Scenario Hang on ODI Procedure
Hi Experts,
We have one ODI scenario which consists of a few ODI procedure steps with anonymous PL/SQL block. When one procedure takes a long time to process data (>60min. when data volume is large), the ODI scenario hangs intermittently on the procedure (ODI Operator shows Running state and no progress to next step in Scenario). The pl/sql script finished fine when running against database directly processing the same dataset.
When the ODI step hangs, the database side where the pl/sql runs on has no more activities, and the db session(v$session) which processes the ODI procedure goes away as well (db session not existing on db anymore). But the ODI Operator still shows the step in running state and hangs there forever (days). The jdbc connection from ODI to db looks fine.
How can we fix this problem in ODI? The ODI version is 10.1.3.5.
Appreciate your input on this.
Thanks,The doc said "If your command is being executed in a transaction (numbered 0 to 9)" then I should set 'Commit'. But I used 'Autocommit' for transaction, is the 'Commit' necessary here?
Thanks! -
SQL Override. How to use custom SQL in ODI?
I am new to ODI & have an Informatica background. I am looking for an SQL override capability in ODI. I have an existing SQL which has complex joins, in-line queries, filters, unions & many other complexities. The query reads many existing tables & output 5 fields, which I need to populate in the target table. In Informatica, I would simply create a Target table of these 5 fields, import the same table as both source & target, & then override the source qualifier with the existing SQL. Does ODI have a similar feature?
I know that the same can be achieved using core ODI features, but I am trying to get it done quickly without re-inventing the wheels.
Thanks,
Dinesh.Dinesh
you can not use SQL over-ride feature which informatica has. I am an informatica developer myself. So I can feel your pain. You are gonna miss a lot of features Informatica has. the one you are looking can not be done using ODI Interfaces. But can be done using ODI Procedures. When you create a step in Procedure you would mention the Source and target schema informations/Context Logical Schema info which should do the work for you. If your source and targets are in different Server then create a DBlink between two servers. Now when you put your select query in it put it like an insert query. -
Executing Java Code in ODI Procedure
Hi All,
I have following java code which i need to write on ODI procedure but i am not sure which technology to chose (Jython,Sunopsis API or Java BeanShell).
I tried to execute the procedure Jyhton with <% "Java code"%> but getting the error.Any boddy can suggest where i doing wrong.
<%
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.*;
import java.util.Hashtable;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
String userName = "HXXXXXX";
String CN1=null;
String Dis_Name=null;
String Mem_of=null;
String Mail=null;
String SGID=null;
File file = new File("C:/Project/ODI/LDAPID.txt");
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "LDAP://XX.if.YYYY.net:389/OU=XYZ,DC=ZZ,DC=if,DC=XYZ,DC=COM");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, new String("" + "\\" + userName));
env.put(Context.SECURITY_CREDENTIALS, "");
DirContext ctx = null;
NamingEnumeration results = null;
ctx = new InitialDirContext(env);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = ctx.search("", "(objectclass=person)", controls);
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
while (results.hasMore())
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attr = attributes.get("cn");
String cn = (String) attr.get();
CN1=(String.valueOf(attributes.get("cn")));
Dis_Name=(String.valueOf(attributes.get("displayName")));
SGID=(String.valueOf(attributes.get("userPrincipalName")));
Mem_of=(String.valueOf(attributes.get("memberOf")));
Mail=(String.valueOf(attributes.get("mail")));
bw.write(CN1 + " || " + Dis_Name + " || " + SGID + " || " + Mail);
bw.newLine();
bw.close();
results.close();
ctx.close();
%>
I am getting following error.
The application script threw an exception: java.lang.NullPointerException BSF info: CODE_JAVA at line: 0 column: columnNo
Please suggest what went wrong with the code.
Thanks
RegardsIn Jython you don not need to declare the type so String userName = "HXXXXXX"; should simply read userName = "HXXXXXX" . Lots of your code need to be rewritten to work with Jython if you choose that as your technology.
-
Transaction tab in ODI Procedure
Hi Experts,
Can anyone help me on what and how exactly the Transaction tab in the ODI Procedure step works? Thanks!
Warm Regards,
VBVHi,
I take you mean the Transaction drop box on a procedure step?
This you can use to isolate transactions within the session, and commit at the end. For an example, if you want to load data from various sources into a table, you can set the Transaction for each procedure step to the same transaction isolation value, with the 'Commit' as 'No commit' and when all data is loaded into the table, have a commit step in your procedure to commit that specific transaction. If for some reason a step fails, then no data within that transaction will be committed to the database.
Its the same as using SQL Developer and having auto commit turned off. You have to manually commit to the database if you want to see the data changes in another session, or you can Role Back your changes within the session if you do not want to commit them.
Have a look at the IKM 'IKM Oracle Incremental Update' - this uses Transaction 1 on the following steps, both have a specified 'No Commit':
'update existing rows'
'Insert new rows',
then has a specific commit step afterwards.
Hope this helps.
Cheers
Bos
Maybe you are looking for
-
i m writing an sql query to print records select role_name,date_created,date_modified,createdbyuser_id,modifiedbyuser_id from t_role; This returns me the the rows in table t_role. But what i want is instead of the id of the person being printed in cr
-
I get the following message when I sync my iPod Touch to my macbook in an attempt to copy songs to the iPod: Some of the items in the iTunes library, including "----------", were not copied to the iPod "------------------- iPod" because you are not a
-
I am brand new to Oracle Text. I am trying to do a where clause with CONTAINS with a pattern I want found ANDed to a pattern I want excluded (using NOT) from the results that the condition before the AND would return on its own. Example: select disti
-
How to create a bookmark in iPad Air?
Just bought my new iPad Air w/IOS 7 and I see the plus sign but it doesn't add the bookmark. I just want to add it as a favorite.
-
Hi All, ebs r12.1.3 Q. How can we recreate opmn (WEBOHProcessManager) service on Windows? Autoconfig did not recreate it. Thank you, F.