我有一个奇怪的问题。我创建了一个表来存储视图的每日快照。视图(SOME_CALC)和表(SOME_CALC_HIST)具有相同的定义,类似于
Col_Name |Type |Nullable
---------------|----------|--------
UPDATE_INST |DATE |Y <- only in the table, SYSDATE
ITEM_NAME |VARCHAR2 |Y <- (should be a) numeric string
CALC_VALUE |NUMBER |Y <- filled by a ROUND(SUM(VALUE), 0) in the view
DATA_DATE |DATE |Y <- filled by a SELECT(MAX(INST)) FROM... in the view
我们的想法是建立一个视图,根据当前数据和DATA_DATE中的一组数据为每个ITEM_NAME计算CALC_VALUE。每天都有一个机制(这里没有涉及,它适用于所有其他实例)运行一个程序(SOME_CALC_APPEND),它或多或少只做
CREATE PROCEDURE "SOME_CALC_APPEND" AUTHID CURRENT_USER AS
BEGIN
INSERT INTO SOME_CALC_HIST
SELECT SYSDATE, * FROM SOME_CALC
END
虽然我可以在没有任何错误的情况下执行BEGIN和END之间的部分以及执行完整的过程,但是当它作为预定作业运行时,同样的函数会抛出错误ORA-01722。
有没有人看到我可能错过的任何可能的问题?我不想深入研究调度事项,因为这是多年来运行稳健且稳定的第三方产品。
我知道这有点模糊,不是很详细,但唉,这就是我的所有信息。我的第一个猜测是ITEM_NAME,因为它类似于序列号并且曾经是NUMBER,所以我改变了。错误仍然存在,唯一的左侧数字是CALC_VALUE。
代码重播:
_SOME_CALC_HIST _
CREATE TABLE SOME_CALC_HIST
( "UPDATE_INST" DATE DEFAULT sysdate,
"ITEM_NAME" VARCHAR2(5 BYTE),
"CALC_VALUE" NUMBER(*,0),
"DATA_DATE" DATE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE ".." ;
_SOME_CALC _
CREATE OR REPLACE FORCE VIEW SOME_CALC ("ITEM_NAME", "CALC_VALUE", "DATA_DATE") AS
SELECT
VT.ITEM_NAME
, VT.CALC_VALUE
, (SELECT MAX(UPDATED_INST) FROM SOURCE_2) AS DATA_DATE
FROM (
SELECT
VT.ITEM_NAME
ROUND(SUM(VALUE), 0) AS CALC_VALUE
FROM SOURCE_1 VT
GROUP BY VT.ITEM_NAME
) VT;
关于调度机制:
配置表CFG_PROCEDURES和CFG_SCHED有一种机制。我必须首先在CFG_PROCEDURES表中放入一个过程来注册&#34;调度机制的程序:
Procedure_Name | Owner
-----------------|-----------
SOME_CALC_APPEND | my Schema
然后我可以将程序安排为CFG_SCHED中的作业:
Interval|Order|Procedure
--------|-----|----------------
daily | 1 |SOME_CALC_APPEND
另一个视图可确保正确设置所有授权并创建代码以设置缺少的授权。 现在,每天(小时,分钟,你有什么)所有日常工作(程序)都按照给定的顺序运行。
在路上,该机制使用函数LOAD_OBJECT(&#39; object&#39;)来执行调度对象。当我手动执行此操作时
exec LOAD_OBJECT('SOME_CALC_APPEND');
它有效。
答案 0 :(得分:1)
好的,我认为问题不在于程序代码,我认为工作是将错误的值传递给程序。
CREATE or REPLACE PROCEDURE "SOME_CALC_APPEND" (AUTHID, CURRENT_USER) AS
BEGIN
INSERT INTO SOME_CALC_HIST (UPDATE_INST, ITEM_NAME, CALC_VALUE, DATA_DATE)
VALUES (SYSDATE, (select ITEM_NAME from SOME_CALC), (select CALC_VALUE from SOME_CALC), (select DATA_DATE from SOME_CALC))
END
EDITED!
请你试试这件事让我知道吗?
答案 1 :(得分:0)
在insert脚本和select语句中提供列名。
示例...
INSERT INTO SOME_CALC_HIST(UPDATE_INST, ITEM_NAME, CALC_VALUE, DATA_DATE)
SELECT SYSDATE, ITEM_NAME, CALC_VALUE, DATA_DATE FROM SOME_CALC
答案 2 :(得分:-1)
你尝试将字符串转换为数字,就像这样to_number(mystring)?