调试oracle过程

时间:2018-08-07 11:17:15

标签: sql oracle oracle-spatial

我有一个oracle存储过程,输入是

  

p_processId = 5660

     

p_featureClassName ='未来包裹'

     

p_DrawnGeometry = MDSYS.SDO_GEOMETRY(2003,2400000,null,       MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,27,2003,1),       MDSYS.SDO_ORDINATE_ARRAY(8439212.4589933194220066070556640625,       4540074.1191380098462104797363281250,8439201.7998965308070182800292968750,4540058.374383729882538318634033203125,8439315.814959609881043434143066406250,4540058.374466760084033012390136718750,8439319.9868115298449993133544921875,4540067.6362674199044704437255859375,8439323.231370599940419197082519531250,4540081.528450479730963706970214843750,8439328.328618479892611503601074218750,4540097.737373660318553447723388671875,8439330.6458750404417514801025390625,4540129.691041340120136737823486328125,8439332.959363190457224845886230468750,4540149.486472180113196372985839843750,8439227.984901839867234230041503906250,4540148.055711519904434680938720703125,8439225.43722324073314666748046875,4540138.489620880223810672760009765625,8439223.1199580393731594085693359375,4540118.576599569991230964660644531250,8439220.802692830562591552734375,4540098.663578259758651256561279296875,8439212.4589933194220066070556640625,4540074.1191380098462104797363281250, 8439252.679629899561405181 8847656250、4540086.660427900031208992004394531250、8439243.2996299006044864654541015625、4540125.440427900291979379396796728515625、8439299.99962989985942840576171875、4540138.040427899919450283050537109375、8439310.49962989989989942889925025025025025092592525025045094592525025090295450925945250450250902954509259452507609452509002509002502509925092594525065250945925450-2509065290945-2509068525092-9252509525094525078250945250-925-450-29025095250925945250-450-28025095250925945250-450-28025095290945250-450-250-450-25095290-925250450-450-450250450-450250450-450925450-92525097450过钱付钱了吗?

过程:

CREATE OR REPLACE 
    PROCEDURE get_DrawnGeometries (
          p_processId           IN INTEGER
        , p_featureClassName    IN VARCHAR2
        , p_DrawnGeometry       IN SDO_GEOMETRY
        , p_prm_val             OUT VARCHAR2
    )
    IS

       PRAGMA AUTONOMOUS_TRANSACTION;

        CURSOR featClassAttributes_cur (featureClassName IN VARCHAR2) IS
            SELECT
                  gac.id
                , lower(gac.column_name)    AS column_name
                , gac.view_u_pk
                , gac.data_type
                , gas.naziv
                , gat.table_name
            FROM geo_atrib_columns gac
            JOIN geo_atrib_tables gat ON gat.table_name = gac.table_name
            JOIN geo_app_slojevi gas ON gas.naziv = gat.layer_name
            WHERE gas.naziv = featureClassName
                AND gat.aktivan = 1
                AND gac.aktivan = 1
                AND gac.view_iu_write = 1
            ORDER BY gac.view_order;

        vc_sql          CLOB;
        vc_sql2         CLOB;
        vc_sql3         CLOB;
        v_columns       VARCHAR2(1000);
        v_tableName     VARCHAR2(1000);
        v_whereClause   VARCHAR2(1000);
        v_whereClause2  VARCHAR2(1000);
        v_g_col_name    VARCHAR2(30);
        v_tolerance     VARCHAR2(20);
        v_separator     VARCHAR2(16) := ' || ''' || glob_var.v_strSeparator || ''' || ';
        p_id            INTEGER;

        v_mssg          VARCHAR2(500)   := NULL;

    BEGIN

        vc_sql := 'SELECT #columns# FROM #table_name# WHERE #where_clause#';
        vc_sql2 := 'SELECT #columns# FROM #table_name# WHERE #where_clause2#';
        vc_sql3 := vc_sql;

        FOR rt_att IN featClassAttributes_cur(p_featureClassName) LOOP

            IF rt_att.data_type = 'N' THEN
                v_columns := v_columns || v_separator || ' nvl(gt_util.num2CharPointSep(' || rt_att.column_name|| '), ''NULL'')';
            ELSE
                v_columns := v_columns || v_separator || ' nvl(to_char(' || rt_att.column_name|| '), ''NULL'')';
            END IF;

                    IF v_tableName IS NULL THEN
                v_tableName := rt_att.table_name;
            END IF;
    --dbms_output.put_line(v_tableName);
        END LOOP;

        v_columns := ltrim(v_columns, v_separator);

        v_g_col_name := gt_util.get_layer_g_col(v_tableName);
        v_tolerance := gt_util.num2CharPointSep(gt_util.get_layer_tollerance(v_tableName, v_g_col_name));

        --v_whereClause := 'ins_id = {0} AND SDO_GEOM.RELATE(:geom, ''EQUAL+INSIDE+CONTAINS+COVEREDBY+COVERS+OVERLAPBDYINTERSECT'', ' || v_g_col_name || ', ' || v_tolerance || ') = ''EQUAL+INSIDE+CONTAINS+COVEREDBY+COVERS+OVERLAPBDYINTERSECT''';
        v_whereClause := 'ins_id = {0} AND SDO_GEOM.RELATE(:geom, ''EQUAL'', ' || v_g_col_name || ', ' || v_tolerance || ') = ''EQUAL''';
        v_whereClause2 := 'ins_id = {0} AND gt_util.geom_is_equal(:geom, ' || v_g_col_name || ', ' || v_tolerance || ') = ''TRUE''';
        v_whereClause := replace(v_whereClause, '{0}', to_char(p_processId));
        v_whereClause2 := replace(v_whereClause2, '{0}', to_char(p_processId));

        vc_sql := replace(vc_sql, '#columns#', v_columns);
        vc_sql := replace(vc_sql, '#table_name#', v_tableName);
        vc_sql := replace(vc_sql, '#where_clause#', v_whereClause);

        vc_sql2 := replace(vc_sql2, '#columns#', v_columns);
        vc_sql2 := replace(vc_sql2, '#table_name#', v_tableName);
        vc_sql2 := replace(vc_sql2, '#where_clause2#', v_whereClause2);

        dbms_output.put_line(vc_sql);
        dbms_output.put_line(vc_sql2);

        BEGIN
            EXECUTE IMMEDIATE vc_sql INTO p_prm_val USING p_DrawnGeometry;
        EXCEPTION WHEN NO_DATA_FOUND THEN
            EXECUTE IMMEDIATE vc_sql2 INTO p_prm_val USING p_DrawnGeometry;
        WHEN TOO_MANY_ROWS THEN

            vc_sql3 := replace(vc_sql3, '#columns#', 'id');
            vc_sql3 := replace(vc_sql3, '#table_name#', v_tableName);
            vc_sql3 := replace(vc_sql3, '#where_clause#', v_whereClause);

            vc_sql3 := 'SELECT * FROM (' || vc_sql3 || ' ORDER BY id DESC) WHERE ROWNUM = 1';
            EXECUTE IMMEDIATE vc_sql3 INTO p_id USING p_DrawnGeometry;
            EXECUTE IMMEDIATE 'DELETE FROM ' || v_tableName || ' WHERE id = ' || p_id;
            COMMIT;

            v_mssg := 'Identical geometry already exists. Drawn geometry is deleted. If you want to delete new geometry please delete the old one first';
            RAISE error_util.ep_UsrExc;
                    --dbms_output.put_line(vc_sql2);
        END;
    EXCEPTION WHEN error_util.ep_UsrExc THEN
        ERROR_UTIL.log_and_raise(SQLCODE, SQLERRM, v_mssg, DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
        RAISE;

    END get_DrawnGeometries; 

如何检查结果并调试输出? 当我称它为返回错误时

  

Procedure execution failed ORA-06550: line 1, column 233: PLS-00382: expression is of wrong type ORA-06550: line 1, column 213: PL/SQL: Statement ignored

1 个答案:

答案 0 :(得分:0)

在PL / SQL Developer中,您可以右键单击过程名称,单击测试并开始调试