0

私は SQL Developer を使用して、社内の Oracle 10g データベースにクエリを実行する PL/SQL ステートメントを作成しています。これらのクエリには、一連の結合や多くのステートメントで同一の基準など、多くの共通コンポーネントがあることがわかりました。私の問題は、これらのセクションのいずれかでコードを更新するときに、同じ共通コードを使用する他のすべてのステートメントを追跡して手動で更新し、すべてのステートメントが互いに一貫して相互に正確になるようにする必要があることです。

ソースコード管理システムをまだ実装していません。さまざまな SQL ステートメントのこれらの「動的な」サブセクションを体系的に管理できるソースコード管理システム (SVN、TFS など) はありますか? 私の考えでは、共通コード ブロックを更新すると、それらの更新はカスケードされ、同じ共通コードを使用する他のステートメントのいずれかで更新されます。

そのような機能が存在しない場合、私が説明した方法で数百ではないにしても、数十の個別の SQL ステートメントを管理するための提案は何ですか?

4

1 に答える 1

0
CREATE TABLE example_one
(
    eo_id    NUMBER
,   eo_value NUMBER
);

INSERT INTO example_one(eo_id, eo_value) VALUES(1, 10);    

CREATE TABLE example_two
(
    et_id    NUMBER
,   et_value NUMBER
);

INSERT INTO example_two(et_id, et_value) VALUES(1, 20);    

CREATE TABLE db_sql_statements
(
    s_stmt_id NUMBER
,   s_stmt    VARCHAR2(4000) /* should be CLOB - it can exceed 4000 CHAR */
);

INSERT INTO db_sql_statements(s_stmt_id, s_stmt) VALUES(1,'SELECT ~[columns_list_#00001]~ FROM ~[source_tables_#00001]~ ~[ON join_conditions_#00001]~ ~[WHERE where_conditions_#00001]~');
);

CREATE TABLE db_sql_parameters
(
    p_param_id VARCHAR2(4000)
,   p_param    VARCHAR2(4000)
);

INSERT INTO db_sql_parameters(p_param_id, p_param) VALUES('columns_list_#00001',     'eo.eo_id, eo.eo_value + et.et_value');
INSERT INTO db_sql_parameters(p_param_id, p_param) VALUES('source_tables_#00001',    'example_one eo JOIN example_two et');
INSERT INTO db_sql_parameters(p_param_id, p_param) VALUES('join_conditions_#00001',  'ON eo.eo_id = et.et_id');
INSERT INTO db_sql_parameters(p_param_id, p_param) VALUES('where_conditions_#00001', 'WHERE 1 = 1');

CREATE TABLE db_sql_stmt_param_bridge
(
    pb_stmt_id  NUMBER
,   pb_param_r  NUMBER
,   pb_param_id VARCHAR2(4000)
);

INSERT INTO db_sql_stmt_param_bridge(pb_stmt_id, pb_param_r, pb_param_id) VALUES(1, 1, 'columns_list_#00001');
INSERT INTO db_sql_stmt_param_bridge(pb_stmt_id, pb_param_r, pb_param_id) VALUES(1, 2, 'source_tables_#00001');
INSERT INTO db_sql_stmt_param_bridge(pb_stmt_id, pb_param_r, pb_param_id) VALUES(1, 3, 'join_conditions_#00001');
INSERT INTO db_sql_stmt_param_bridge(pb_stmt_id, pb_param_r, pb_param_id) VALUES(1, 4, 'where_conditions_#00001');

SELECT  s.s_stmt, p.p_param_id, p.p_param
FROM    db_sql_statements s
JOIN    db_sql_stmt_param_bridge pb
ON      s.s_stmt_id = pb.pb_stmt_id
JOIN    db_sql_parameters p
ON      pb.pb_param_id = p.p_param_id
;
/*
SELECT ~[columns_list_#00001]~ FROM ~[source_tables_#00001]~ ~[ON join_conditions_#00001]~ ~[WHERE where_conditions_#00001]~    columns_list_#00001 eo.eo_id, eo.eo_value + et.et_value
SELECT ~[columns_list_#00001]~ FROM ~[source_tables_#00001]~ ~[ON join_conditions_#00001]~ ~[WHERE where_conditions_#00001]~    source_tables_#00001    example_one eo JOIN example_two et
SELECT ~[columns_list_#00001]~ FROM ~[source_tables_#00001]~ ~[ON join_conditions_#00001]~ ~[WHERE where_conditions_#00001]~    join_conditions_#00001  ON eo.eo_id = et.et_id
SELECT ~[columns_list_#00001]~ FROM ~[source_tables_#00001]~ ~[ON join_conditions_#00001]~ ~[WHERE where_conditions_#00001]~    where_conditions_#00001 WHERE 1 = 1
*/

SELECT  REPLACE
        (
            REPLACE
            (
                REPLACE
                (
                    REPLACE
                    (
                        s_stmt
                    ,   '~[columns_list_#00001]~'
                    ,   p_param
                    )
                ,   '~[source_tables_#00001]~'
                ,   lead_p_param
                )
            ,   '~[ON join_conditions_#00001]~'
            ,   lead_p_param2
            )
        ,   '~[WHERE where_conditions_#00001]~'
        ,   lead_p_param3
        )
FROM
(
        SELECT  s.s_stmt
        ,       p.p_param_id
        ,       p.p_param
        ,       LEAD(p.p_param)    OVER (PARTITION BY s.s_stmt ORDER BY pb.pb_param_r) AS lead_p_param
        ,       LEAD(p.p_param, 2) OVER (PARTITION BY s.s_stmt ORDER BY pb.pb_param_r) AS lead_p_param2
        ,       LEAD(p.p_param, 3) OVER (PARTITION BY s.s_stmt ORDER BY pb.pb_param_r) AS lead_p_param3
        ,       ROW_NUMBER()       OVER (PARTITION BY s.s_stmt ORDER BY pb.pb_param_r) AS r_number
        FROM    db_sql_statements s
        JOIN    db_sql_stmt_param_bridge pb
        ON      s.s_stmt_id = pb.pb_stmt_id
        JOIN    db_sql_parameters p
        ON      pb.pb_param_id = p.p_param_id
)
WHERE   r_number = 1
;    
-- SELECT eo.eo_id, eo.eo_value + et.et_value FROM example_one eo JOIN example_two et ON eo.eo_id = et.et_id WHERE 1 = 1

SELECT eo.eo_id, eo.eo_value + et.et_value FROM example_one eo JOIN example_two et ON eo.eo_id = et.et_id WHERE 1 = 1;
-- 1    30

PL/SQL から実行し、EXECUTE IMMEDIATE を使用します。私はdbフレームワークを書いていたときに似たようなことをしました。

于 2013-06-10T11:07:53.130 に答える