自从我迈出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;
答案 0 :(得分:1)
我假设该表属于另一个模式,而不是编译函数的模式。如果您通过角色而不是直接授予这些表上的select,Oracle将为您提供ORA-00942
。
有关详细信息,请参阅this stackoverflow question。
答案 1 :(得分:0)
您是否在表的相同模式上编译过程?如果您使用toad尝试在光标位于表名上时按F4按钮或尝试启动命令“desc tablename”
答案 2 :(得分:0)
尝试在与您尝试编译/执行该函数的模式相同的模式中描述具有相同凭据的表名。
desc tablename