Oracle 为什么存储过程阶段在CLI上正常工作时出错?

Oracle 为什么存储过程阶段在CLI上正常工作时出错?,oracle,etl,data-warehouse,datastage,Oracle,Etl,Data Warehouse,Datastage,我有一个存储过程,我已经用Begin StoredProcedureName尝试了我的存储过程;终止 在我的CLI中,这是一个成功。我的存储过程工作得非常好 CREATE OR REPLACE PROCEDURE "SCHEMA"."TEST_SP" IS BACKDATE_BUSSDATE DATE; VAR VARCHAR2(4000); BEGIN --- SET VARIABLE END OF MONTH --- SELECT EOMLASTMONTH

我有一个存储过程,我已经用Begin StoredProcedureName尝试了我的存储过程;终止 在我的CLI中,这是一个成功。我的存储过程工作得非常好

CREATE OR REPLACE PROCEDURE "SCHEMA"."TEST_SP"
IS
    BACKDATE_BUSSDATE DATE;
    VAR VARCHAR2(4000);
BEGIN

    --- SET VARIABLE END OF MONTH ---
    SELECT EOMLASTMONTH 
    INTO BACKDATE_BUSSDATE
    FROM DIM_DATE WHERE TO_DATE(BUS_DT,'DD/MM/YYYY') = TO_DATE(SYSDATE-1,'DD/MM/YYYY');

    -- TRUNCATE TABLE TEMP
    VAR := 'TRUNCATE TABLE TEMP_INSERT_BACKDATE_HIPORT';
    EXECUTE IMMEDIATE VAR;

    --- INSERT DATA KE TEMP TABLE YG DI BUAT ---
    INSERT INTO TEMP_INSERT_BACKDATE_HIPORT
    SELECT CURR.BUSINESS_NUMBER,CURR.PERSON_NUMBER,CURR.ACCOUNT_SOURCE,CURR.PRODUCT_CODE,CURR.CONTAINER_NUMBER,CURR.CURRENCY_CODE,CURR.EXCHANGE_RATE,CURR.QUANTITY,CURR.MARKET_PRICE,CURR.MARKET_PRICE_DATE,CURR.PURCHASE_PRICE,CURR.PURCHASE_VALUE,CURR.CURRENT_BALANCE_ORG_AMOUNT,CURR.CURRENT_BALANCE_IDR_AMOUNT,CURR.TOTAL_DEBIT_AMOUNT,CURR.TOTAL_CREDIT_AMOUNT,CURR.LAST_MONTH_BALANCE_ORG_AMOUNT,CURR.PROFIT_LOSS_POTENTIAL_PCT,CURR.SUM_INSURED_AMOUNT,CURR.CASH_BLOCKING_FLAG,CURR.CASH_BLOCKING_REASON,CURR.INTEREST_RATE,CURR.INTEREST_TYPE_CODE,CURR.ACCRUED_INTEREST,CURR.PAYMENT_DATE,CURR.PROCESS
    FROM (SELECT * FROM TEST
    WHERE ACCOUNT_SOURCE = 'HIPORT' 
    AND BUSINESS_DATE = TO_DATE(SYSDATE-1,'DD/MM/YYYY')) CURR
    LEFT JOIN (SELECT * FROM TEST
    WHERE ACCOUNT_SOURCE = 'HIPORT' 
    AND TO_DATE(BUSINESS_DATE) = TO_DATE(SYSDATE-2)) EOM
    ON EOM.BUSINESS_NUMBER = CURR.BUSINESS_NUMBER 
    AND EOM.PERSON_NUMBER = CURR.PERSON_NUMBER 
    AND EOM.ACCOUNT_SOURCE = CURR.ACCOUNT_SOURCE 
    AND EOM.PRODUCT_CODE = CURR.PRODUCT_CODE
    WHERE EOM.BUSINESS_NUMBER IS NULL;

    --- INSERT DATA KE FACT WM POSITION DARI TEMP TABLE ---
    LOOP
         DBMS_OUTPUT.PUT_LINE(BACKDATE_BUSSDATE);
         DBMS_OUTPUT.PUT_LINE( 'INSERT INTO TEST(BUSINESS_DATE,BUSINESS_NUMBER,PERSON_NUMBER,ACCOUNT_SOURCE,PRODUCT_CODE,CONTAINER_NUMBER,CURRENCY_CODE,EXCHANGE_RATE,QUANTITY,MARKET_PRICE,MARKET_PRICE_DATE,PURCHASE_PRICE,PURCHASE_VALUE,CURRENT_BALANCE_ORG_AMOUNT,CURRENT_BALANCE_IDR_AMOUNT,TOTAL_DEBIT_AMOUNT,TOTAL_CREDIT_AMOUNT,LAST_MONTH_BALANCE_ORG_AMOUNT,PROFIT_LOSS_POTENTIAL_PCT,SUM_INSURED_AMOUNT,CASH_BLOCKING_FLAG,CASH_BLOCKING_REASON,INTEREST_RATE,INTEREST_TYPE_CODE,ACCRUED_INTEREST,PAYMENT_DATE,PROCESS_NAME,INSERT_DATE)'
                            || 'SELECT TO_DATE('''|| BACKDATE_BUSSDATE || ''',''DD-MM-YYYY''),BUSINESS_NUMBER,PERSON_NUMBER,ACCOUNT_SOURCE,PRODUCT_CODE,CONTAINER_NUMBER,CURRENCY_CODE,EXCHANGE_RATE,QUANTITY,MARKET_PRICE,MARKET_PRICE_DATE,PURCHASE_PRICE,PURCHASE_VALUE,CURRENT_BALANCE_ORG_AMOUNT,CURRENT_BALANCE_IDR_AMOUNT,TOTAL_DEBIT_AMOUNT,TOTAL_CREDIT_AMOUNT,LAST_MONTH_BALANCE_ORG_AMOUNT,PROFIT_LOSS_POTENTIAL_PCT,SUM_INSURED_AMOUNT,CASH_BLOCKING_FLAG,CASH_BLOCKING_REASON,INTEREST_RATE,INTEREST_TYPE_CODE,ACCRUED_INTEREST,PAYMENT_DATE,PROCESS,TO_DATE(SYSDATE)'
                             || 'FROM TEMP_INSERT');
         EXECUTE IMMEDIATE  'INSERT INTO TEST (BUSINESS_DATE,BUSINESS_NUMBER,PERSON_NUMBER,ACCOUNT_SOURCE,PRODUCT_CODE,CONTAINER_NUMBER,CURRENCY_CODE,EXCHANGE_RATE,QUANTITY,MARKET_PRICE,MARKET_PRICE_DATE,PURCHASE_PRICE,PURCHASE_VALUE,CURRENT_BALANCE_ORG_AMOUNT,CURRENT_BALANCE_IDR_AMOUNT,TOTAL_DEBIT_AMOUNT,TOTAL_CREDIT_AMOUNT,LAST_MONTH_BALANCE_ORG_AMOUNT,PROFIT_LOSS_POTENTIAL_PCT,SUM_INSURED_AMOUNT,CASH_BLOCKING_FLAG,CASH_BLOCKING_REASON,INTEREST_RATE,INTEREST_TYPE_CODE,ACCRUED_INTEREST,PAYMENT_DATE,PROCESS_NAME,INSERT_DATE)'
                            || 'SELECT TO_DATE('''|| BACKDATE_BUSSDATE || ''',''DD-MM-YYYY''),BUSINESS__NUMBER,PERSON_NUMBER,ACCOUNT_SOURCE,PRODUCT_CODE,CONTAINER_NUMBER,CURRENCY_CODE,EXCHANGE_RATE,QUANTITY,MARKET_PRICE,MARKET_PRICE_DATE,PURCHASE_PRICE,PURCHASE_VALUE,CURRENT_BALANCE_ORG_AMOUNT,CURRENT_BALANCE_IDR_AMOUNT,TOTAL_DEBIT_AMOUNT,TOTAL_CREDIT_AMOUNT,LAST_MONTH_BALANCE_ORG_AMOUNT,PROFIT_LOSS_POTENTIAL_PCT,SUM_INSURED_AMOUNT,CASH_BLOCKING_FLAG,CASH_BLOCKING_REASON,INTEREST_RATE,INTEREST_TYPE_CODE,ACCRUED_INTEREST,PAYMENT_DATE,PROCESS,TO_DATE(SYSDATE)'
                             || 'FROM TEMP_INSERT';
         BACKDATE_BUSSDATE := TO_DATE(BACKDATE_BUSSDATE+1,'DD/MM/YYYY');
         EXIT WHEN TO_DATE(BACKDATE_BUSSDATE,'DD/MM/YYYY') = TO_DATE(SYSDATE-1,'DD/MM/YYYY');
    END LOOP;
END;
我试图将我的存储过程放在DataStage的存储过程阶段。 我的工作设计是这样的

Oracle Connector=>Transformer=>Oracle Connector=>Stored Procedure
如果数据为0,则作业可以正常运行。当我尝试使用一个或多个数据时,它给了我一个错误ORA-6512。 “ORA xxxx”错误不是来自Oracle错误吗?但是我运行了我的Oracle存储过程,它完美地完成了

我的存储过程阶段配置如下所示

Oracle Connector=>Transformer=>Oracle Connector=>Stored Procedure
语法: 程序名称:TEST_SP 程序类型:转换 生成过程调用:已选中(我已尝试手动“取消选中”,但结果仍然相同)

数据连接:(空)

概述: 我已经填好了所有的证件

在输入中: 为每行执行过程(选中) 列:我从变压器中获取所有信息

有人知道吗?我已经被卡住了

编辑:
这是我将存储过程阶段更改为“目标”时的消息

存储过程\u 5,0:致命错误:致命错误:ORA-06550:第1行第7列:PLS-00306:调用“TEST\u SP”时参数的数目或类型错误ORA-06550:第1行第7列:PL/SQL:语句被忽略 存储过程错误

这就是我转变为“转变”时所传达的信息


存储过程\u 5,0:致命错误:致命错误:ORA-01858:在“SCHEMA.TEST\u SP”第8行的ORA-06512:第1行的ORA-06512:中,在需要数字的位置找到了一个非数字字符。您的问题很可能是:

TO_DATE(SYSDATE-1,'DD/MM/YYYY');
SYSDATE已经是一个日期,所以当我们看到它时,我们会这样做:

  • 评估SYSDATE-1
  • 将其转换为字符串(因为to_DATE将字符串作为第一个输入)
  • 然后将该字符串转换为具有to_date的日期
在会话中,默认格式掩码可能是dd/mm/yyyy,因此从日期到字符串再到字符串的转换可以正常工作

在DataStage中,如果它们的会话格式不同(例如DD-MON-YYYY),则会出现错误,因为您将执行以下操作:

  • 将sysdate-1转换为字符串=2020年5月10日
  • 尝试使用DD/MM/YYYY将其转换为日期。。。。。啪
代码

BUSINESS_DATE = TO_DATE(SYSDATE-1,'DD/MM/YYYY'))
只是需要

BUSINESS_DATE = trunc(SYSDATE-1)

请显示完整的错误堆栈跟踪。您是否在DataStage中使用/设计并行作业?这是当我将存储过程阶段更改为“目标”存储过程时的消息。\u 5,0:致命错误:致命错误:ORA-06550:第1行,第7列:PLS-00306:调用“TEST\u SP”ORA-06550:第1行时出现的消息,第7列:PL/SQL:语句忽略了存储过程错误,这是当我更改为transform Storage_Procedure_5,0:致命错误:致命:ORA-01858:在“SCHEMA.TEST_SP”第8行ORA-06512:在第1行我在并行作业中使用的数字处发现了一个非数字字符,使用数据库选项卡中调色板中的存储过程阶段,我尝试将存储过程阶段移动到oracle连接器之后,以及最后一个转换器之后。当我将它移到oracle连接器之后,它给了我一个成功(绿线),但存储过程没有运行/执行。但当我将存储过程阶段移到转换器之后时,我的转换器有两个节点分支,第一个是oracle连接器,第二个是存储过程。它给了我一个错误。是的,我试过你的建议,谢谢你回答顺便说一句:)