• PLSQL Convert Object to String


    Problem & Goal

    Usually, like in java, any object will implement its to_string() function. So in Plsql, there is the same requirement.
     We want to implement to_string() in plsql.

    Thinking

    When one Object' type is basic type in plsql, then the function will return its value. Otherwise, the function will return its typename.

    Solution  & Example

    CREATE OR REPLACE FUNCTION to_string(obj IN ANYDATA) RETURN VARCHAR2 IS
    code PLS_INTEGER;
    v_type AnyType;
    BEGIN
        code :=obj.getType(v_type);
        CASE 
            code WHEN DBMS_TYPES.TYPECODE_VARCHAR2 THEN
                    RETURN  TO_CHAR(obj.AccessVarchar2());
                WHEN DBMS_TYPES.TYPECODE_BDOUBLE THEN
                    RETURN TO_CHAR(obj.AccessBDouble());
                WHEN DBMS_TYPES.TYPECODE_BFLOAT THEN
                    RETURN TO_CHAR(obj.AccessBFloat());
                WHEN DBMS_TYPES.TYPECODE_NUMBER THEN
                    RETURN TO_CHAR(obj.AccessNumber());
            ELSE RETURN obj.getTypeName(); END CASE;
    END;
    /
    show errors;
    CREATE OR REPLACE TYPE TEST FORCE AS OBJECT
    (id Number,
     name VARCHAR2(20),
     CONSTRUCTOR FUNCTION TEST RETURN SELF AS RESULT);
    /
    show errors;
    CREATE OR REPLACE TYPE BODY TEST AS
     CONSTRUCTOR FUNCTION TEST RETURN SELF AS RESULT IS 
     BEGIN RETURN;END;
    END; 
    /
    show errors;
    SET SERVEROUTPUT ON;
    DECLARE 
    a Number;
    b VARCHAR2(20);
    c TEST;
    BEGIN
        a :=1;
        b:='julia zhang';
        c :=TEST();
        dbms_output.put_line('a:to_string()::::'||to_string(AnyData.convertNumber(a)));
        dbms_output.put_line('b:to_string()::::'||to_string(AnyData.convertVarchar2(b)));
        dbms_output.put_line('c:to_string()::::'||to_string(AnyData.convertObject(c)));
    END;
    /

    Extend

    CREATE OR REPLACE FUNCTION AnydataArray1ToString (id IN AnydataArray , for_flatten BOOLEAN ) RETURN
    VARCHAR2 IS
    i INTEGER ; result_str VARCHAR2 (32767); BEGIN
        result_str  := '';
        FOR i IN 1..id.count
        LOOP
            IF  for_flatten  THEN
                result_str  := result_str  || ', ' || objectToString (id (i ));
            ELSE result_str  := result_str  || objectToString (id (i )); END IF;
        END LOOP;
        IF  for_flatten  THEN RETURN substr (result_str , 3); ELSE
            RETURN result_str ; END IF;
    END ;
    /

    Refference

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/t_anydat.htm#BEHEICHI

    每天一点点
  • 相关阅读:
    rmq +二分暴力 hdu 5726
    8.25 ccpc 比赛总结
    莫比乌斯反演题目总结
    HDU 4848 Wow! Such Conquering! (搜索+floyd)
    Codeforces 982 C Cut 'em all!(DFS)
    Codefoces 986C AND Graph(DFS)
    CodeForces 986A Fair(BFS)
    ACM经验贴
    Kattis A+B Problem(FFT)
    CF E. Porcelain (双向dp)
  • 原文地址:https://www.cnblogs.com/juliazhang/p/5091314.html
Copyright © 2020-2023  润新知