Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 编译PL/SQL函数时出错_Oracle_Function_Plsql_Syntax Error - Fatal编程技术网

Oracle 编译PL/SQL函数时出错

Oracle 编译PL/SQL函数时出错,oracle,function,plsql,syntax-error,Oracle,Function,Plsql,Syntax Error,在编译上面的程序时,我遇到了这个错误 错误(2,18):PLS-00103:遇到符号“(“当需要下列情况之一时:.@%);是否使用验证ID作为群集顺序 外部字符确定性并行_启用流水线 聚合结果缓存 更新: CREATE OR REPLACE FUNCTION employer_details_func RETURN VARCHAR(20); IS e_name VARCHAR(20); BEGIN SELECT emp_name INTO e_name FR

在编译上面的程序时,我遇到了这个错误

错误(2,18):PLS-00103:遇到符号“(“当需要下列情况之一时:.@%);是否使用验证ID作为群集顺序 外部字符确定性并行_启用流水线 聚合结果缓存

更新

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;
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;
错误

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;
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;

我的代码有什么问题?请告诉我。

使用
返回VARCHAR
而不是
返回VARCHAR(20);

Oracle文档位于says RETURN子句…数据类型不能指定长度、精度或比例


编辑

我用这段代码对它进行了双重检查,它似乎有效(返回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;
创建或替换

功能雇主\详细信息\功能

返回VARCHAR2

e_name VARCHAR2(20)

开始

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;
SELECT last_name INTO e_name FROM employees WHERE employee_id ='100';

RETURN e_name;
最终雇主详细信息


您不能提及由oracle引擎管理的返回类型的大小。

您也可以这样尝试

创建或替换功能雇主\u详细信息\u功能

返回员工。e_名称%TYPE

e_name员工。e_name%类型

开始

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;
SELECT last_name INTO e_name FROM employees WHERE employee_id ='100';

RETURN e_name;

最终雇主\u details\u func;

是否有不使用VARCHAR2的原因?参数的数据类型或函数的返回数据类型应为无约束数据类型。也就是说,您确实需要指定最大大小。在您的情况下,
返回varchar(20)
应该是简单的
返回varchar2
。不要使用
varchar
数据类型。尽管
varchar
varchar2
是同义词,现在它们之间没有区别,但它们的行为在将来可能会发生变化-请坚持使用
varchar2
。此外,请考虑以下事实:ry可能不返回任何行,或返回多行,从而分别引发
未找到任何数据
太多行
异常。@Nicholas Krasnov I已更改,但仍然错误持久化我您到底更改了什么?发布代码的更新版本,并显示相应的错误消息。您的左分号很可能在r
返回…
-删除它。否则您的函数应该可以正常编译。@Nicholas Krasnov查看我的更新版本和错误varchar和varchar2之间的主要区别是什么?目前,没有区别。但是根据这一点,将来可能会发生变化。因此,使用varchar在迁移到ORACLE数据库的未来版本。它在SQL Fiddle上工作(请参见编辑)。您使用的ORACLE版本是什么?可以工作,但return varchar2(20)和return varchar2之间的区别是什么?区别是,varchar2(20)意味着,您的varchar2的最大长度可以是20字节或字符,而没有(20)字符它不受限制。在函数返回值的定义中,您不能限制最大长度。Oracle不允许。它工作正常,但
return varchar2(20)
return varchar2
之间有什么区别?为此,请检查下面@halbit的答案。这是Oracle的定义。