ORACLE PL / SQL:表或视图不存在

时间:2014-01-31 20:43:35

标签: oracle plsql

自从我迈出PL / SQL的第一步以来,我对这个主题有所帮助:

当尝试创建一个函数时,我得到一个错误:对于所有5个Select语句(以及游标声明中的语句),“表或视图不存在”。我确信所有的表都存在。

非常感谢提前。

CREATE OR REPLACE FUNCTION ZINSKALK (vtid IN NUMBER, intart IN INTEGER)
   RETURN NUMBER
IS
   j         INTEGER := 0;
   p         NUMBER := 1;
   q         NUMBER := 0;
   t         NUMBER := 1;
   r         NUMBER := 0;
   lz        INTEGER := 0;
   modusvn   INTEGER := 0;
   w1        NUMBER := 0;
   w2        NUMBER := 0;
   i         INTEGER := 0;

   TYPE ARRAY_TYP IS VARRAY (200) OF NUMBER (10, 2);

   RARRAY    ARRAY_TYP;

   CURSOR C1
   IS
        SELECT vtobslpos.anzahl, vtobslpos.betrag
          FROM vtobsl, vtobslpos
         WHERE     vtobsl.sysid = vtobslpos.sysvtobsl
               AND vtobsl.sysid IN
                      (SELECT MAX (vtobsl.sysid)
                         FROM vtobsl
                        WHERE vtobsl.sysvt = vtid AND vtobsl.rang = 100)
      ORDER BY vtobslpos.rang ASC;

BEGIN
   SELECT SUM (vtobslpos.anzahl)
     INTO lz
     FROM vtobslpos, vtobsl
    WHERE     vtobslpos.sysvtobsl = vtobsl.sysid
          AND vtobsl.sysvt = vtid
          AND vtobsl.sysid IN (SELECT MAX (sysid)
                                 FROM vtobsl
                                WHERE sysvt = vtid AND rang = 100);

   SELECT vtobsl.modus
     INTO modusvn
     FROM vtobsl
    WHERE vtobsl.sysid IN (SELECT MAX (sysid)
                             FROM vtobsl
                            WHERE sysvt = vtid AND rang = 100);

   SELECT   bgextern
          - sz
          + (CASE intart
                WHEN 1 THEN 0
                WHEN 2 THEN - (sz2 + disagio)
                WHEN 3 THEN (sz2 + disagio - provision)
                ELSE 0
             END)
     INTO W1
     FROM vt
    WHERE sysid = vtid;

   SELECT rw + rsv
     INTO w2
     FROM vt
    WHERE sysid = vtid;

   i := (CASE WHEN modusvn = 0 THEN 1 ELSE 0 END);

   RARRAY (1) := -w1;
   RARRAY (lz + 1) := w2;

   FOR x IN C1
   LOOP
      FOR y IN 1 .. x.anzahl
      LOOP
         i := i + 1;
         RARRAY (i) := RARRAY (i) + x.betrag;
      END LOOP;
   END LOOP;



   WHILE ABS (p) >= 0.001
   LOOP
      p := 0;
      q := 0;
      j := 0;

      FOR z IN 1 .. lz + 1
      LOOP
         j := j + 1;
         p := p + RARRAY (j) * POWER (t, j - 1);
         q := q + (j - 1) * RARRAY (j) * POWER (t, j - 2);
      END LOOP;

      t := t - p / q;
   END LOOP;

   r := 1200 / t - 1200;
   RETURN r;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END;

3 个答案:

答案 0 :(得分:1)

我假设该表属于另一个模式,而不是编译函数的模式。如果您通过角色而不是直接授予这些表上的select,Oracle将为您提供ORA-00942

有关详细信息,请参阅this stackoverflow question

答案 1 :(得分:0)

您是否在表的相同模式上编译过程?如果您使用toad尝试在光标位于表名上时按F4按钮或尝试启动命令“desc tablename”

答案 2 :(得分:0)

尝试在与您尝试编译/执行该函数的模式相同的模式中描述具有相同凭据的表名。

desc tablename