ORA-01722:仅在程序

时间:2017-03-22 07:22:12

标签: sql oracle stored-procedures plsql oracle11g

我有一个奇怪的问题。我创建了一个表来存储视图的每日快照。视图(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');

它有效。

3 个答案:

答案 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)?