为什么在 CLI 上运行正常时会出现存储过程阶段错误?
Why Stored Procedure Stage error while it works fine on CLI?
我有一个存储过程,我已经用 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 数据,工作 运行 完美。当我尝试使用 1 个或多个数据时,它给了我一个错误 ORA-6512。
"ORA-xxxx" 不是来自 Oracle 的错误吗?但是我 运行 我的 Oracle 存储过程完美地完成了。
我的存储过程阶段配置如下所示
语法:
程序名称:TEST_SP
程序类型:转换
生成过程调用:选中(我已经手动尝试 'unchecked' 并且结果仍然相同)
数据连接:(空)
一般:
我已经填写了所有凭据
输入:
为每一行执行程序(选中)
专栏:我从变压器
请问有人知道吗?我已经卡住了。
编辑:
这是我将存储过程阶段更改为 "Target"
时的消息
Stored_Procedure_5,0: 致命错误:致命:ORA-06550:第 1 行,第 7 列:PLS-00306:调用 'TEST_SP' ORA-06550 时参数的数量或类型错误:第 1 行,第 7 列:PL/SQL:语句被忽略
存储过程错误
这是我转换成transform时的提示
Stored_Procedure_5,0:致命错误:致命:ORA-01858:在需要数字的地方发现了非数字字符 ORA-06512:在 "SCHEMA.TEST_SP",第 8 行 ORA-06512 : 在第 1 行
您的问题很可能是这样的:
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..... splat!
将其转换为日期
代码
BUSINESS_DATE = TO_DATE(SYSDATE-1,'DD/MM/YYYY'))
只需要
BUSINESS_DATE = trunc(SYSDATE-1)
我有一个存储过程,我已经用 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 数据,工作 运行 完美。当我尝试使用 1 个或多个数据时,它给了我一个错误 ORA-6512。 "ORA-xxxx" 不是来自 Oracle 的错误吗?但是我 运行 我的 Oracle 存储过程完美地完成了。
我的存储过程阶段配置如下所示
语法: 程序名称:TEST_SP 程序类型:转换 生成过程调用:选中(我已经手动尝试 'unchecked' 并且结果仍然相同)
数据连接:(空)
一般: 我已经填写了所有凭据
输入: 为每一行执行程序(选中) 专栏:我从变压器
请问有人知道吗?我已经卡住了。
编辑: 这是我将存储过程阶段更改为 "Target"
时的消息Stored_Procedure_5,0: 致命错误:致命:ORA-06550:第 1 行,第 7 列:PLS-00306:调用 'TEST_SP' ORA-06550 时参数的数量或类型错误:第 1 行,第 7 列:PL/SQL:语句被忽略 存储过程错误
这是我转换成transform时的提示
Stored_Procedure_5,0:致命错误:致命:ORA-01858:在需要数字的地方发现了非数字字符 ORA-06512:在 "SCHEMA.TEST_SP",第 8 行 ORA-06512 : 在第 1 行
您的问题很可能是这样的:
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..... splat! 将其转换为日期
代码
BUSINESS_DATE = TO_DATE(SYSDATE-1,'DD/MM/YYYY'))
只需要
BUSINESS_DATE = trunc(SYSDATE-1)