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

PLSQLでのリフレクション?

    ANYTYPEを使用する必要があります ANYDATAを説明する タイプが正しいことを確認してください。次に、piecewiseを使用して属性にアクセスできます およびgetVarchar2

    以下のコードのほとんどは型をチェックするためのものであり、型の安全性を気にしない場合は必要ありません。

    戻り値を返す関数:

    create or replace function get_first_attribute(
        p_anydata in out anydata --note the "out" - this is required for the "piecewise"
    ) return varchar2 is
        v_typecode pls_integer;
        v_anytype anytype;
    begin
        --Get the typecode, and the ANYTYPE
        v_typecode := p_anydata.getType(v_anytype);
    
        --Check that it's really an object
        if v_typecode = dbms_types.typecode_object then
            --If it is an object, find the first item
            declare
                v_first_attribute_typecode pls_integer;
                v_aname          varchar2(32767);
                v_result         pls_integer;
                v_varchar        varchar2(32767);
                --Variables we don't really care about, but need for function output
                v_prec           pls_integer; 
                v_scale          pls_integer;
                v_len            pls_integer;
                v_csid           pls_integer;
                v_csfrm          pls_integer;
                v_attr_elt_type  anytype;
            begin
                v_first_attribute_typecode := v_anytype.getAttrElemInfo(
                    pos            => 1, --First attribute
                    prec           => v_prec,
                    scale          => v_scale,
                    len            => v_len,
                    csid           => v_csid,
                    csfrm          => v_csfrm,
                    attr_elt_type  => v_attr_elt_type,
                    aname          => v_aname);
    
                --Check typecode of attribute
                if v_first_attribute_typecode = dbms_types.typecode_varchar2 then
                    --Now that we've verified the type, get the actual value.
                    p_anydata.piecewise;
                    v_result := p_anydata.getVarchar2(c => v_varchar);
    
                    --DEBUG: Print the attribute name, in case you're curious
                    --dbms_output.put_line('v_aname: '||v_aname);
    
                    return v_varchar;
                else
                    raise_application_error(-20000, 'Unexpected 1st Attribute Typecode: '||
                        v_first_attribute_typecode);
                end if;
            end;
        else
            raise_application_error(-20000, 'Unexpected Typecode: '||v_typecode);
        end if;
    end;
    /
    

    タイプ:

    create or replace type Person_type as object (fname varchar2(10), lname varchar2(10));
    
    create or replace type other_type as object (first_name varchar2(10), poetry clob);
    

    テスト実行:

    declare
        --Create records
        v_type1 person_type := person_type('Ford', 'Prefect');
        v_type2 other_type := other_type('Paula', 'blah blah...');
        v_anydata anydata;
    begin
        --Convert to ANYDATA.
        --Works as long as ANYDATA is an object with a varchar2 as the first attribute.
        v_anydata := anydata.convertObject(v_type1);
        dbms_output.put_line(get_first_attribute(v_anydata));
    
        v_anydata := anydata.convertObject(v_type2);
        dbms_output.put_line(get_first_attribute(v_anydata));
    end;
    /
    

    出力:

    Ford
    Paula
    



    1. 同じ値のブロックに属する値を分離せずに、いくつかの一意の値を取得します

    2. JSON_ARRAY_INSERT()–MySQLのJSON配列に値を挿入します

    3. MuleSoftがGraphQLを採用してAPI統合を推進

    4. ORACLEIIFステートメント