2015-01-12 6 views
0

Я создал функцию PL/SQL, как этотКак изменить существующую функцию в оракула

CREATE Function conc(name IN varchar2) 
RETURN varchar2 DETERMINISTIC 
IS 
fn varchar2(30); 

BEGIN 
    SELECT concat(fname,lname) into fn 
    FROM tab1 where fname=name; 

    return fn; 
End; 
/

Он получил успешно создан без каких-либо ошибок компиляции. Теперь я попытался изменившие выше существующей функции с помощью замены

CREATE OR REPLACE Function conc(name IN varchar2) 
RETURN varchar2 DETERMINISTIC 
IS 
fn varchar2(30); 

BEGIN 
    SELECT concat(lname,fname) into fn 
    FROM tab1 where fname=name; 

    return fn; 
End; 
/

Здесь функция создана с ошибками компиляции.

Может кто-нибудь предположить, почему это происходит, и что является лучшим способом изменить существующее определение функции pl/sql.

+3

Используйте 'show errors', чтобы увидеть найденные проблемы, или запросите представление' user_errors'. –

+2

вы также можете получить интерактивную обратную связь, показывающую ошибки компиляции, если вы используете нашу среду IDE, Oracle SQL Developer – thatjeffsmith

+5

И не имеет прямого значения, но: [«Не указывать DETERMINISTIC для функции, результат которой зависит от состояния переменных сеанса или объектов схемы» ] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/function.htm#CJAFICJJ). –

ответ

0

Синтаксическая ошибка со вторым кодом, в котором вы используете «Создать или заменить». Это правильный способ редактирования существующей функции. Я смог создать его в своей среде разработки. Смотрите ниже:

SQL> create table tab1 (
 
    2 lname varchar2(15), 
 
    3 fname varchar2(15), 
 
    4 create_dt date 
 
    5 ) 
 
    6/
 

 
Table created. 
 

 
SQL> CREATE OR REPLACE Function conc(name IN varchar2) 
 
    2 RETURN varchar2 DETERMINISTIC 
 
    3 IS 
 
    4 fn varchar2(30); 
 
    5 
 
    6 BEGIN 
 
    7  SELECT concat(lname,fname) into fn 
 
    8  FROM tab1 where fname=name; 
 
    9 
 
10  return fn; 
 
11 End; 
 
12/
 

 
Function created.

Есть несколько способов, чтобы увидеть ошибки. Во-первых, и наиболее распространенный, это «Показывать ошибки», как упоминалось выше в Alex Pool. В качестве альтернативы вы также можете запросить таблицу user_errors (или all_errors соответственно) для всех подробностей, которые могут потребоваться для отладки. Смотрите ниже, где я намеренно уронил таблицу, чтобы получить ошибки:

SQL> drop table tab1; 
 

 
Table dropped. 
 

 
SQL> CREATE OR REPLACE Function conc(name IN varchar2) 
 
    2 RETURN varchar2 DETERMINISTIC 
 
    3 IS 
 
    4 fn varchar2(30); 
 
    5 
 
    6 BEGIN 
 
    7  SELECT concat(lname,fname) into fn 
 
    8  FROM tab1 where fname=name; 
 
    9 
 
10  return fn; 
 
11 End; 
 
12/
 

 
Warning: Function created with compilation errors. 
 

 
SQL> select line, text from user_errors where NAME='CONC'; 
 

 
     LINE 
 
---------- 
 
TEXT 
 
-------------------------------------------------------------------------------- 
 
     8 
 
PL/SQL: ORA-00942: table or view does not exist 
 

 
     7 
 
PL/SQL: SQL Statement ignored

Интересно, что кажется, что это таблица очищается каждый раз, когда вы запускаете заявление. Смотрите ниже:

SQL> drop Function conc; 
 

 
Function dropped. 
 

 
SQL> select line, text from user_errors where NAME='CONC'; 
 

 
no rows selected 
 

 
SQL>

Btw, когда вы пытались создать свой код функции, вы получили какой-либо обратной связи с системой. Вы должны ожидать либо «Созданная функция». или «Предупреждение: функция, созданная с ошибками компиляции».? Если нет, вы можете проверить свою окружающую среду. Надеюсь это поможет!

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