Sql ORA-01722:仅程序中的编号无效

Sql ORA-01722:仅程序中的编号无效,sql,oracle,stored-procedures,plsql,oracle11g,Sql,Oracle,Stored Procedures,Plsql,Oracle11g,我有个奇怪的问题。我创建了一个表来存储视图的每日快照。视图(部分计算)和表(部分计算历史)具有相同的定义,如 Col_Name |Type |Nullable ---------------|----------|-------- UPDATE_INST |DATE |Y <- only in the table, SYSDATE ITEM_NAME |VARCHAR2 |Y <- (should

我有个奇怪的问题。我创建了一个表来存储视图的每日快照。视图(部分计算)和表(部分计算历史)具有相同的定义,如

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
虽然我可以执行BEGIN和END之间的部分而不会出现任何错误,也可以执行完整的过程,但当它作为计划作业运行时,同样的函数会抛出错误ORA-01722

有人看到我可能遗漏的任何问题吗?我不想深入研究日程安排问题,因为这是第三方的东西,多年来运行稳定可靠

我知道这是一个有点模糊,不是很详细,但唉,这是我所有的信息。我的第一个猜测是ITEM_名称,因为它类似于序列号,过去是数字,所以我更改了它。错误仍然存在,唯一剩下的数字是CALC_值

代码回购:

_一些计算历史_

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 ".." ;
_一些计算_

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表中放入一个程序,以“注册”调度机制的程序:

Procedure_Name   | Owner
-----------------|-----------
SOME_CALC_APPEND | my Schema
然后我可以在CFG_SCHED中将该过程安排为作业:

Interval|Order|Procedure
--------|-----|----------------
daily   | 1   |SOME_CALC_APPEND
另一个视图确保正确设置所有授权,并创建代码来设置缺少的授权。 现在,每天(小时、分钟、你有什么)所有的日常工作(过程)都是按给定的顺序运行的

接下来,该机制使用一个函数LOAD_对象(“OBJECT”)来执行调度对象。当我手动操作时

exec LOAD_OBJECT('SOME_CALC_APPEND');

它起作用了

在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

您是否尝试将字符串转换为数字,例如转换为数字(mystring)?

好的,我认为问题不在于过程代码,我认为作业正在将错误的值传递给过程

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
编辑


请您尝试一下并告诉我好吗?

您能分享您的表结构的查询代码吗?@Gerry,您的意思是什么?比如为SOME_CALC_HIST创建代码?我将尝试提供更多的代码。如果您插入到表中,我只想查看该表的sql代码。您是否计划每次运行实际的过程?换言之,您是否将实际过程作为作业运行?@Gerry,据我所知,我是这样做的。有一种奇特的机制,我在表中注册过程。然后,我可以在另一个表中创建一个作业,并在其中输入过程名称和间隔。管理视图检查授权并创建sql代码以设置缺少的授权。花哨的东西……不,但我不认为我必须这样做,因为唯一的数字都是计算出来的,而且没有错误。当我手动运行视图时,结果只有20多行,所有的数字都是格式良好的数字。这没有关系。现在我明白了。你是说打电话的人!那是埋得很深的,我不确定如果没有必要的话我是否想打开那只箱子,因为机械装置通常工作得很好。好的,我同意你的意见。在没有所有相关场景的情况下,我很难重新创建场景,但我们不要让它复杂化。让我建议一个不同的程序。是否将AUTHID和当前用户作为值插入某些计算历史?不超出创建或替换过程某些计算将AUTHID当前用户作为开始。。东西不,先生,我想我没有。嘿@Gerry:你问的问题是对的,好的橡皮鸭。我取消了调用方函数的掩埋,我可以用我的过程作为参数手动调用该函数。它运行时没有错误。我想知道这是否是一个计时问题。我让程序做了类似的事情,但是通过手动给出所有的值,你能试试吗?
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