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

一括収集を伴うテーブル関数が無効なデータ型をスローする

    プレーンSQLでパッケージレベルの型を使用しようとしていますが、これは許可されていません。パッケージで宣言されたタイプは、PL / SQLの外部(またはPL / SQL内のプレーンSQLステートメントでも)に表示されないか、有効ではありません。あなたがしていることの縮小版:

    create or replace package types as
        type my_rec_type is record (dummy dual.dummy%type);
        type my_table_type is table of my_rec_type index by binary_integer;
    end types;
    /
    
    create or replace package p42 as
        function get_table return types.my_table_type;
    end p42;
    /
    
    create or replace package body p42 as
        function get_table return types.my_table_type is
            my_table types.my_table_type;
        begin
            select * bulk collect into my_table from dual;
            return my_table;
        end get_table;
    end p42;
    /
    
    select * from table(p42.get_table);
    
    SQL Error: ORA-00902: invalid datatype
    

    パッケージ内であっても、テーブル関数を使おうとしたプロシージャがあると、エラーが発生します。追加した場合:

        procedure test_proc is
        begin
            for r in (select * from table(get_table)) loop
                null;
            end loop;
        end test_proc;
    

    ...パッケージ本体のコンパイルはORA-22905: cannot access rows from a non-nested table item

    パッケージではなくスキーマレベルで型を宣言する必要があるため、SQLを使用してcreate type コマンド

    create type my_obj_type is object (dummy varchar2(1));
    /
    
    create type my_table_type is table of my_obj_type;
    /
    
    create or replace package p42 as
        function get_table return my_table_type;
    end p42;
    /
    
    create or replace package body p42 as
        function get_table return my_table_type is
            my_table my_table_type;
        begin
            select my_obj_type(dummy) bulk collect into my_table from dual;
            return my_table;
        end get_table;
    end p42;
    /
    
    select * from table(p42.get_table);
    
    DUMMY
    -----
    X
    


    1. MySQLで正規表現が機能しない方法

    2. 初期化されていない定数Mysql2::Client ::SECURE_CONNECTION

    3. 存在しない場合はMySQLINSERT(主キーを使用しない)

    4. PowerShellスクリプトを介してMySQLコンソールを使用する