我正在生成一个程序来检查所有数据问题,例如数据库表中的重复数据。所以格式如下所示:
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;
现在我有两个问题我已经完成了所有事情,除了将值TEST_LEVEL
,START_WID
,END_WID
存储在我在过程中评论的那个因为一个使用它我得到了编译器错误。
问题1: - 如何将TEST_LEVEL
,START_WID
,END_WID
存储在(通过@Swapna答案帮助回答。)
问题2:我将在不同的表上运行多个查询并将它们存储在V_ACT_RESULT
中,所以我想如果有办法将所有查询保存在某个文本文件中,然后只需用一些脚本导入它们。如果任何人都知道如何做到这一点请详细说明。
答案 0 :(得分:1)
对于像你这样的陈述选择......来自&lt;&lt; table_to_be_tested&gt;&gt;插入&lt;&lt; table_to_be_tested&gt;&gt; ....您需要使用动态SQL,例如执行立即或REF游标。 这是基于Oracle scott.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
简而言之,您不能在过程中使用占位符来表名。你需要写一堆代码......
答案 1 :(得分:1)
START_WID和END_WID在过程输入参数中定义为数字,并将其插入到日期字段中。这可能是您收到编译错误的原因之一。如果你也分享错误会有所帮助。