Ошибка (11,10): PLS-00306: неверный номер или типы аргументов при вызове 'CONSTRUCT' - PullRequest
1 голос
/ 22 апреля 2019

Я новичок в 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 Ответ

1 голос
/ 22 апреля 2019

Вы можете использовать незарезервированное ключевое слово, например 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 пользователя для неадминистративных целей. Может быть чрезвычайно вредным для вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...