sql >> Databasteknik >  >> RDS >> Oracle

ORA-06553:PLS-801:internt fel [55018] vid test av funktion som returnerar ROWTYPE

Eftersom du bara vill testa funktionen kan du använda ett anonymt PL/SQL-block för att anropa den och tilldela dess resultat till en matchande radtypsvariabel, t.ex.:

declare
  l_row mytable%rowtype;
begin
  -- call the function and assign the result to a variable
  l_row := mypackage.myfunction(1, 2, 3);
  -- do something with the result
  dbms_output.put_line(l_row.some_columns);
end;
/

Snabb demo med ett påhittat bord och utökad funktion:

create table mytable (col1, col2, col3, col4, col5) as
select 1, 2, 3, 'test', sysdate from dual;

create or replace package mypackage as 
  function myfunction (param1 number, param2 number, param3 number)
  return mytable%rowtype;
end mypackage;
/

create or replace package body mypackage as 
  function myfunction (param1 number, param2 number, param3 number)
  return mytable%rowtype is
    l_row mytable%rowtype;
  begin
    select * into l_row
    from mytable
    where col1 = param1
    and col2 = param2
    and col3 = param3;

    return l_row;
  end myfunction;
end mypackage;
/

Att anropa från SQL får samma fel som du ser nu:

    select mypackage.myfunction(1, 2, 3) from dual;

    SQL Error: ORA-06553: PLS-801: internal error [55018]

Men med ett block (kör här genom SQL Developer med utdata aktiverat):

set serveroutput on

declare
  l_row mytable%rowtype;
begin
  -- call the function and assign the result to a variable
  l_row := mypackage.myfunction(1, 2, 3);
  -- do something with the result
  dbms_output.put_line(l_row.col4 ||':'|| l_row.col5);
end;
/

test:2019-04-29


PL/SQL procedure successfully completed.

db<>fiol



  1. Begränsa värdet på en MySQL-datatyp till ett specifikt intervall (helst inte ENUM)

  2. Integrering av SQLCipher med greenDAO

  3. Kopiera data från en tabell till en annan tabell. Databaser är olika och tabellstrukturen är annorlunda

  4. Problem med att ändra datum med en trigger i oracle