sql >> データベース >  >> RDS >> Oracle

ORA-06553:PLS-801:ROWTYPEを返す関数をテストする際の内部エラー[55018]

    関数をテストしたいだけなので、匿名のPL / SQLブロックを使用して関数を呼び出し、その結果を一致する行タイプ変数に割り当てることができます(例:

    )。
    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;
    /
    

    作成されたテーブルと拡張機能を備えたクイックデモ:

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

    SQLから呼び出すと、現在表示されているのと同じエラーが発生します:

        select mypackage.myfunction(1, 2, 3) from dual;
    
        SQL Error: ORA-06553: PLS-801: internal error [55018]
    

    ただし、ブロックを使用する場合(ここでは、出力を有効にしてSQL Developerを実行します):

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



    1. MYSQL:自己結合時にレコードを繰り返すデカルト積を回避する

    2. NHibernate-構成で(oracle)方言が見つかりませんでした

    3. 46SQLローダーの制御ファイル

    4. 他のテーブルの存在に基づくMysqlの更新