错误(11,10):PLS-00306:调用“ CONSTRUCT”时参数的数量或类型错误

时间:2019-04-22 16:15:06

标签: oracle plsql oracle10g

我是plsql的新手,我尝试运行这段代码,但是它给出了错误且无法调试

create or replace type final as object ( ename1 varchar2(10), sal1 
NUMBER(7,2));--object 

create or replace type construct is table  of final; /*nested table of 
object type */

create or replace function returnmore (empno1 number) /*Function to 
return more*/
return construct 
AS
vemp construct:=construct();
vename varchar2(10);
vsal1 NUMBER(7,2);
begin

select ENAME,sal into vename,vsal1 from emp where empno=empno1;
vemp.extend;
vemp(1):=construct(vename,vsal1);
return vemp;
end;

但是给我一个错误

Function SYSTEM.RETURNMORE@loacaDB
Error(11,1): PL/SQL: Statement ignored
Error(11,10): PLS-00306: wrong number or types of arguments in call to 'CONSTRUCT'

我正在使用oracle10gxe和sqldeveloper4.2

1 个答案:

答案 0 :(得分:1)

您可以选择使用typ_emp之类的非保留关键字,而不要使用保留的final

SQL> create or replace type typ_emp as object ( ename1 varchar2(10), sal1 number(7,2));
SQL> create or replace type construct is table of typ_emp; 

,您可以按如下所示转换函数:

create or replace function returnmore( empno1 emp.empno%type ) 
 return construct AS
  vemp   construct := construct();
  vename varchar2(10);
  vsal1  number(7, 2);
begin
  select ename, sal into vename, vsal1 from emp where empno = empno1;
  vemp.extend;
  vemp(1) := typ_emp(vename, vsal1);
  dbms_output.put_line(vemp(1).ename1);

  return vemp;
end;
/

或另一种处理相同操作的方式:

SQL> create or replace function returnmore( empno1 emp.empno%type ) 
  return construct AS
  vemp   construct := construct();
  v_sql  varchar2(2000);
begin
  v_sql := 'select typ_emp(ename, sal) from emp where empno = :v_empno1';
  execute immediate v_sql bulk collect into vemp using empno1;
  dbms_output.put_line(vemp(1).ename1);

  return vemp;
end;
/

并通过调用

进行测试
SQL> set serveroutput on; 
SQL> declare
  result construct;
begin
  result := returnmore( 1 ); -- 1 is just an ordinary presumed value for empno 
end; 
/   --> this will return the employee name as printed.

P.S。切勿将SYSTEM用户用于非管理目的。可能对您的数据库极为有害。