我正在尝试从 ODI 调用以下 PL SQL 过程。代码在 SQL Developer 中完美运行。
create or replace PROCEDURE OMS_UPD_CODE_STATO (myUID_ELAB IN NUMBER, myTABLE_NAME IN VARCHAR2, P_RESULT OUT VARCHAR2) AS
C_TREC NUMBER;
C_TOT NUMBER;
str1 varchar2(1000);
str2 varchar2(1000);
BEGIN
str1:='select to_number(rtrim(substr(utente, 18,23),''0'')) from '|| myTABLE_NAME || ' where TREC =''99'' AND UID_ELAB = '||myUID_ELAB;
EXECUTE IMMEDIATE STR1 INTO C_TREC;
str2:='select count(*) from '|| myTABLE_NAME || ' where TREC is not null';
EXECUTE IMMEDIATE STR2 INTO C_TOT;
IF C_TOT = C_TREC THEN
execute immediate 'update'|| myTABLE_NAME || 'set CODE_STATO = ''N'' WHERE UID_ELAB = '|| myUID_ELAB;
P_RESULT:='OK';
commit;
ELSE
P_RESULT:='KO';
END IF;
END OMS_UPD_CODE_STATO;
在 ODI 中,我编写了如下程序:
declare
P_RESULT VARCHAR2(100);
begin
OMS_UPD_CODE_STATO( #OMS.UID_ELAB, #OMS.ATTR_NOME_TABELLA, P_RESULT);
end;
其中前两个参数是 INPUT 参数,而第三个参数 P_RESULT 是 PL SQL 存储过程中存在的 OUT 参数。通过从 ODI 调用该过程,我收到以下错误:
ODI-1228: Task Procedure-omsUpdateStato-callStored fails on the target connection OMS_DEV.
Caused By: java.sql.SQLException: ORA-06550: line 5, column 27:
PLS-00357: Table,View Or Sequence reference 'OMS_S_PERSONE_FISICHE' not allowed in this context
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:466)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:407)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1113)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:546)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:603)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:218)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:31)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1316)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:2168)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:2100)
at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:363)
at oracle.odi.runtime.agent.execution.sql.SQLCommand.execute(SQLCommand.java:205)
at oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:141)
at oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:28)
at oracle.odi.runtime.agent.execution.TaskExecutionHandler.handleTask(TaskExecutionHandler.java:52)
at oracle.odi.runtime.agent.execution.SessionTask.processTask(SessionTask.java:206)
at oracle.odi.runtime.agent.execution.SessionTask.doExecuteTask(SessionTask.java:117)
at oracle.odi.runtime.agent.execution.AbstractSessionTask.execute(AbstractSessionTask.java:886)
at oracle.odi.runtime.agent.execution.SessionExecutor$SerialTrain.runTasks(SessionExecutor.java:2227)
at oracle.odi.runtime.agent.execution.SessionExecutor.executeSession(SessionExecutor.java:611)
at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor$1.doAction(TaskExecutorAgentRequestProcessor.java:719)
at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor$1.doAction(TaskExecutorAgentRequestProcessor.java:611)
at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:203)
at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor.doProcessStartAgentTask(TaskExecutorAgentRequestProcessor.java:801)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access$1400(StartSessRequestProcessor.java:74)
at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:702)
at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:180)
at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:108)
at java.lang.Thread.run(Thread.java:745)
你知道如何解决它吗?我打错电话了吗?谢谢