2013-11-27 2 views
0
CREATE OR REPLACE FUNCTION employer_details_func 
    RETURN VARCHAR(20); 
IS 
    e_name VARCHAR(20); 
BEGIN 
    SELECT emp_name INTO e_name 
    FROM employees WHERE emp_no = '5'; 
    RETURN e_name; 
END employer_details_func; 

При составлении выше программ я получаю эту ошибкуПолучение ошибки при компиляции функции PL/SQL

Ошибку (2,18): PLS-00103: Столкнутый символ "(" когда ожидается одно из следующих действий:. @%; является AUTHID в порядке кластера с помощью внешнего характера детерминированного parallel_enable конвейерного совокупности RESULT_CACHE

ОБНОВЛЕНИЯ:

CREATE OR REPLACE FUNCTION employer_details_func 
    RETURN VARCHAR2(20); 
IS 
    e_name VARCHAR2(20); 
BEGIN 
    SELECT emp_name INTO e_name FROM employees WHERE emp_no ='5'; 
    RETURN e_name; 
END employer_details_func; 

Ошибка:

Error(2,19): PLS-00103: Encountered the symbol "(" when expecting one of the following:  . @ % ; is authid as cluster order using external character deterministic parallel_enable pipelined aggregate result_cache 

Что случилось с моим кодом? Пожалуйста, дайте мне знать.

+0

Есть ли причина не использовать VARCHAR2? – halfbit

+0

@halfbit no reason – ram

+0

Тип данных параметров или возвращаемый тип данных функции должны быть неограниченными типами данных. То есть вам нужно указать максимальный размер. В вашем случае 'return varchar (20)' должен быть просто 'return varchar2'. Не используйте тип данных varchar. Хотя 'varchar' и' varchar2' являются синонимами, и сейчас нет никакой разницы между ними, их поведение может измениться в будущем - придерживаться 'varchar2'. Кроме того, учтите тот факт, что ваш запрос не может возвращать строки или возвращать более одной строки, создавая исключение «no_data_found» или «too_many_rows», соответственно. –

ответ

1

Использовать RETURN VARCHAR вместо RETURN VARCHAR(20);.

Oracle документации на http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htmговорит RETURN Пунктом ... Тип данных не может определить длину, точность и масштаб ...


Редактировать

я дважды проверил на SQL Fiddle с этим кодом и, похоже, работает (возвращает bob):

CREATE TABLE employees(emp_name VARCHAR2(20), emp_no VARCHAR2(20)) 
/
CREATE OR REPLACE FUNCTION employer_details_func 
    RETURN VARCHAR 
IS 
    e_name VARCHAR(20); 
BEGIN 
    SELECT emp_name INTO e_name FROM employees WHERE emp_no ='5'; 
    RETURN e_name; 
END employer_details_func; 
/

insert into employees values('bob','5'); 
select employer_details_func() from dual; 
+0

В чем основное отличие между varchar и varchar2? – ram

+0

В настоящее время нет никакой разницы. Но, согласно http://www.orafaq.com/faq/what_is_the_difference_between_varchar_varchar2_and_char_data_types, это может измениться в будущем. Таким образом, используя VARCHAR, вы рискуете непредвиденными последствиями при переносе в будущие версии базы данных ORACLE. – halfbit

+0

Спасибо за предоставление ценной информации – ram

0

Это должно исправить:

CREATE OR REPLACE FUNCTION employer_details_func 
    RETURN VARCHAR2 
IS 
    e_name VARCHAR2(20); 
BEGIN 
    SELECT emp_name INTO e_name FROM employees WHERE emp_no ='5'; 
    RETURN e_name; 
END employer_details_func; 
+0

это прекрасно работает, но в чем разница между 'return varchar2 (20)' и 'return varchar2'? – ram

+0

Для этого проверьте ответ @halfbit ниже. Это определение Oracle. – Armunin

0

CREATE OR REPLACE

ФУНКЦИЯ employer_details_func

RETURN VARCHAR2

IS

e_name VARCHAR2 (20);

НАЧАТЬ

SELECT last_name INTO e_name FROM employees WHERE employee_id ='100'; 

RETURN e_name; 

END employer_details_func;

Вы не можете указать размер возвращаемого типа, которым управляет двигатель oracle.

0

вы также можете попробовать, как этот

CREATE OR REPLACE FUNCTION employer_details_func

RETURN employees.e_name% TYPE

IS

сотрудников e_name.e_name% TYPE;

НАЧАТЬ

SELECT emp_name INTO e_name FROM employees WHERE emp_no ='5'; 

RETURN e_name; 

END employer_details_func;

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