2013-12-04 3 views
1

PL/SQL показывает ошибка компиляции. Функция работает правильно и успешно скомпилирована, но если запущен pl/sql-запрос, то показывается компиляция.PlSQL отображение ошибка компиляции

CREATE OR REPLACE FUNCTION f(
    num IN NUMBER, 
    num2 IN NUMBER, 
    ans OUT NUMBER 
) RETURN number IS 
BEGIN 
    ans := num + num2; 
    RETURN ans; 
END; 

CREATE table add1(val1 number(2),val2 number(1),ans number(3)); 

SET SERVEROUTPUT ON ; 

DECLARE 
    a1 add1.val1%TYPE; 
    b1 add1.val2%TYPE; 
    sum add1.ans%TYPE; 
BEGIN 
    WHILE a1!=-99 
    LOOP 
    a1 := &a1; 
    b1 := &b1; 
    sum := f(a1, b1, sum); 
    INSERT INTO add1 VALUES(a1, b1, c1); 
    END LOOP; 
END; 
+0

Я заменил c1 в запросе вставки с суммой, но все же ошибка компиляции ,,, – ngLover

+1

'PL/SQL показывает ошибку компиляции'. Где ошибка (код, сообщение)? На самом деле существует много ошибок: 1) вы пытаетесь использовать переменную 'c1', но вы ее не объявили; 2) 'sum' является зарезервированным словом PL/SQL. Таким образом, вы либо изменяете (рекомендуете) имя переменной, либо заключите 'sum' в двойные кавычки (никогда не делайте этого). Боковое примечание. Старайтесь не записывать функции, возвращающие более одного значения вызывающей стороне посредством комбинации оператора 'return' и одного или нескольких параметров' out'. –

+0

Спасибо @NicholasKrasnov, я получил вашу точку. Теперь его работа,. ,, :) – ngLover

ответ

1

Вы не можете использовать функции IN и OUT в функциях. Только в процедурах. Правильный подход:

create or replace function f(
     num number, 
     num2 number 
    ) return number is 
    ans number; 
    begin 
     ans := num + num2; 
     return ans; 
    end; 

UPD: О, мальчик! В вашем коде слишком много ошибок. Возможно, вам следует описать, что вы пытаетесь сделать со всем этим.

+1

'Вы не можете использовать IN и OUT в функциях' Не верно. Это допустимо. Единственное ограничение - вы не можете использовать эту функцию в SQL, но в PL/SQL, пожалуйста, продолжайте использовать ее, хотя это очень и очень плохая практика. –

+0

Мой плохой, не знал об этом. Хотя я до сих пор не вижу причины использовать функцию с параметрами OUT вместо процедуры с параметрами OUT в PL/SQL. –

Смежные вопросы