0

データベーステーブルの重複など、すべてのデータの問題をチェックする手順を生成しています。そのため、形式は次のように説明されています。

CREATE TABLE <test_table>    --table i created to save the procedure test results
(
RUN_ID number,
QUERY_ID    NUMBER,
QUERY_NAME VARCHAR(1000),
QUERY_STATUS     VARCHAR(10),
MAIN_TABLE_NAME   VARCHAR(500),
EXP_RESULT  VARCHAR(4000),
ACT_RESULT  VARCHAR(4000),
RUN_ON_DT DATE,
TEST_LEVEL_GIVEN NUMBER,
START_TIME_WID NUMBER,
END_TIME_WID NUMBER,
TEST_QUERY  VARCHAR(4000),
QUERY_DESC  VARCHAR(4000),
Comments    VARCHAR(4000)
)




create or replace
    PROCEDURE PROC_TESTING (TEST_LEVEL IN NUMBER DEFAULT 0 , START_WID IN NUMBER DEFAULT 0, END_WID  NUMBER DEFAULT 0) IS
    --TEST_LEVEL=0 IS TO RUN ALL QUERIES : FULL PROCEDURE
    --TEST_LEVEL=1 IS FOR BASIC QUERIES
    --TEST_LEVEL=2 IS FOR DIMENSION QUERIES
    --TEST_LEVEL=3 IS FOR FACT QUERIES
    --TEST_LEVEL=4 IS FOR .... QUERIES
    --TEST_LEVEL=5 IS FOR .... QUERIES

V_RUN_ID NUMBER;
V_QUERY_ID    NUMBER;
V_QUERY_NAME VARCHAR(1000);
V_QUERY_STATUS     VARCHAR(10);
V_MAIN_TABLE_NAME   VARCHAR(500);
V_EXP_RESULT  VARCHAR(4000);
V_ACT_RESULT  VARCHAR(4000);
V_RUN_ON_DT DATE;
V_TEST_QUERY  VARCHAR(4000);
V_QUERY_DESC  VARCHAR(4000);
V_COMMENTS    VARCHAR(4000);



BEGIN

DBMS_OUTPUT.PUT_LINE( 'STARTING THE TESTING PROC ON ' || SYSDATE );

SELECT  RUN_ID.NEXTVAL  INTO V_RUN_ID FROM DUAL;

SELECT SYSDATE INTO V_RUN_ON_DT FROM DUAL;

IF TEST_LEVEL<>1 and TEST_LEVEL<>2 and TEST_LEVEL<>0 
Then
  DBMS_OUTPUT.PUT_LINE( 'Conditions not met' || SYSDATE );
  return;
end if;



IF TEST_LEVEL=1 or TEST_LEVEL=2 or TEST_LEVEL=0 
Then
  V_QUERY_ID:=1;
  V_QUERY_NAME:='Duplicates check';
  V_MAIN_TABLE_NAME:='<table_to_be_tested>';
  V_QUERY_DESC:='checking for duplicates'; 

  -- Expected results
  V_EXP_RESULT := 0; 
  -- Actual results

  select count(*) into V_ACT_RESULT
  from (select  id1
                      , id2
                      , EFFECTIVE_FROM_DT
                      , EFFECTIVE_TO_DT
                      , update_dt       
                      , row_number() over (partition by 
                      id1
                      , id2
                      , EFFECTIVE_FROM_DT
                      , EFFECTIVE_TO_DT
            order by integration_id ) as occurrence
            from <table_to_be_tested>) x
  where occurrence > 1;

  IF V_EXP_RESULT = V_ACT_RESULT THEN 
    V_QUERY_STATUS:='PASS';
  ELSE
    V_QUERY_STATUS:='FAIL';
  END IF; 

END IF;



Insert into <test_table>     --going to store all above explained values into this table
(
RUN_ID ,
QUERY_ID ,
QUERY_NAME ,
QUERY_STATUS   ,
MAIN_TABLE_NAME ,
EXP_RESULT,
ACT_RESULT  ,
RUN_ON_DT,
TEST_LEVEL_GIVEN,
START_TIME_WID,
END_TIME_WID,
TEST_QUERY ,
QUERY_DESC,
Comments )
values
(
V_RUN_ID ,
V_QUERY_ID  ,
V_QUERY_NAME,
V_QUERY_STATUS ,
V_MAIN_TABLE_NAME ,
V_EXP_RESULT  ,
V_ACT_RESULT ,
V_RUN_ON_DT ,
TEST_LEVEL,
START_WID,
END_WID,
V_TEST_QUERY ,
V_QUERY_DESC ,
V_COMMENTS );


END;

今、私は2つの質問がありますが、値を格納することを除いてすべてを実行しました。値 をTEST_LEVEL使用している場合はコンパイラエラーが発生したため、手順でコメントしました。質問1:- 、、を(@Swapnaの回答の助けを借りて)に保存する方法質問2:-異なるテーブルで複数のクエリを実行して保存するので、すべてを保存する方法があるかどうかを考えましたテキストファイルでクエリを実行し、スクリプトを使用してここにインポートします。これを行う方法を知っている人がいる場合は、詳しく説明してください。START_WIDEND_WIDTEST_LEVELSTART_WIDEND_WIDV_ACT_RESULT

4

2 に答える 2

1

START_WIDおよびEND_WIDは、プロシージャ入力パラメータの数値として定義され、日付フィールドに挿入されます。これが、コンパイルエラーが発生する理由の1つである可能性があります。エラーを共有する場合にも役立ちます。

于 2013-02-14T15:12:29.990 に答える
1

あなたのようなステートメントの場合、Select ... from << table_to_be_tested >> Isert into << table_to_be_tested >> ....動的SQLを使用する必要があります(例:EXECUTEIMMEDIATEまたはREFCURSOR)。これは、Oraclescott.empテーブルに基づいて「オンザフライ」で構築されたSQLステートメントの一般的な例です。挿入/更新についても同じことを行います...:

DECLARE
  PROCEDURE get_total(p_tab_name VARCHAR2:= 'scott.emp'
                     , p_column_name VARCHAR2:= 'JOB'
                     , p_list VARCHAR2:= '''MANAGER'', ''CLERK''')
IS
  v_sql           VARCHAR2(200);
  cnt             NUMBER:= 0;
BEGIN
 dbms_output.put_line(p_list);
  v_sql:= 'SELECT count(*) total FROM '|| p_tab_name ||
           ' WHERE '||p_column_name||' IN ('||p_list||')';
    EXECUTE IMMEDIATE v_sql INTO cnt; 
  dbms_output.put_line(cnt);
END;
BEGIN
 get_total;
END;
/

Output:

'MANAGER', 'CLERK'
 7

Oracleドキュメント-このトピックの詳細については、Oracleドキュメントを使用して検索してください...:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28370/executeimmediate_statement.htm#LNPLS01317

つまり、テーブル名のプロシージャでプレースホルダーを使用することはできません。あなたはたくさんのコードを書く必要があります...

于 2013-02-14T14:54:27.470 に答える