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

PL / SQLで変数の型を動的に表示するにはどうすればよいですか?

    関数の仕様に基づいて型をテストすることはできませんが、 IS OF( type ) 演算子または SYS_TYPEID 機能 :

    SQLフィドル

    Oracle11gR2スキーマのセットアップ

    CREATE type my_weird_type IS OBJECT
    (
      a NUMBER
    ) NOT FINAL
    /
    
    CREATE TYPE my_weird_subtype UNDER my_weird_type
    (
       b NUMBER
    )
    /
    
    CREATE FUNCTION getType(
      i_type my_weird_type
    ) RETURN VARCHAR2
    IS
    BEGIN
      IF i_type IS OF( my_weird_subtype ) THEN
        RETURN 'subtype';
      ELSIF i_type IS OF( my_weird_type ) THEN
        RETURN 'type';
      ELSE
        RETURN 'other';
      END IF;
    END;
    /
    
    CREATE FUNCTION getType2(
      i_type my_weird_type
    ) RETURN VARCHAR2
    IS
      o_type USER_TYPES.TYPE_NAME%TYPE;
    BEGIN
      SELECT type_name
      INTO   o_type
      FROM   user_types
      WHERE  typeid = SYS_TYPEID( i_type );
    
      RETURN o_type;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RETURN NULL;
    END;
    /
    
    create table test_my_weird_type(
      value my_weird_type
    )
    /
    
    INSERT INTO test_my_weird_type (value)
    SELECT my_weird_type(1)      FROM DUAL UNION ALL
    SELECT my_weird_subtype(2,3) FROM DUAL UNION ALL
    SELECT NULL                  FROM DUAL
    /
    

    クエリ1

    SELECT t.value.a AS a,
           TREAT( t.value AS my_weird_subtype ).b AS b,
           getType( value ),
           getType2( value )
    FROM   test_my_weird_type t
    

    結果

    |      A |      B | GETTYPE(VALUE) |  GETTYPE2(VALUE) |
    |--------|--------|----------------|------------------|
    |      1 | (null) |           type |    MY_WEIRD_TYPE |
    |      2 |      3 |        subtype | MY_WEIRD_SUBTYPE |
    | (null) | (null) |          other |           (null) |
    


    1. 無効な構文エラータイプ=Hibernateによって生成されたDDLのMyISAM

    2. PHPのセキュリティの質問?

    3. 今日に属するmysqlテーブルレコードから選択します

    4. VB.Netを使用してオンラインMySQLデータベースに接続する