2009-12-10 5 views
2

나는 2 테이블의 이름을 액센트로하는 프로 시저를 인수로 쓰고 2의 행 또는 수를 비교하려고합니다. 또한 2 열의 각 필드를 원합니다. missmatch는 다른 오류 테이블로 이동했습니다.오라클에 일반 프로 시저 작성

누구나이 작업을 수행 할 수있는 PL/SQL 프로 시저를 제공 할 수 있습니까? 오라클에서이 문제를 해결하고 싶습니다. 9

+0

두 테이블은 항상 정확히 동일한 열 정의를 갖고 있으며 모든 테이블간에 하나의 오류 테이블이 있거나 테이블 쌍당 하나의 오류 테이블이 있습니까? –

+0

@ david : 예 그들은 똑같은 문법을 가지고 있습니다. – user223541

답변

1

DBMS_SQL은 이러한 작업에 대한 귀하의 친구입니다.

+0

@ammo : 내 친구를 제게 설명해 주시겠습니까? – user223541

1

dynamic sql은 PL/SQL에서 사용할 수 있습니다. EXECUTE IMMEDIATE 님은 친구입니다. PL/SQL 구문에 대한 확인

CREATE OR REPLACE PROCEDURE COMPARE_ROW_COUNT(T1 IN VARCHAR2(200), T2 IN VARCHAR2(200)) AS 
    v_cursor integer; 
    v_r1 integer; 
    v_r2 integer; 
    v_sql varchar2(200); 
BEGIN 
    v_sql := "select count(1) into :1 from " || T1; 
    EXECUTE IMMEDIATE v_sql USING v_r1; 
    v_sql := "select count(1) into :1 from " || T2; 
    EXECUTE IMMEDIATE v_sql USING v_r2; 
    -- compare v_r1 and v_r2 
END; 

100 % : 두 개의 테이블 이름을 가지고 자신의 행 수를 비교하려고하는 경우

그래서, 당신은 뭔가를 할 것입니다. 지난 PL/SQL 코딩을 마친 이후로 꽤 오래되었습니다!

비슷한 접근 방식으로 DBMS_SQL을 사용하면 동일한 결과를 얻을 수 있습니다. 구문은 좀 더 복잡합니다.

+0

바인드 변수는 테이블 이름을 제공 할 수 없습니다. –

+0

확인. 이를 반영하도록 코드가 변경됩니다. 감사! –

3

Pablos 예제가 제대로 작동하지 않는다는 생각은 옳습니다.

이와 비슷한 방식입니다.

create or replace PROCEDURE COMPARE_ROW_COUNT(T1 IN VARCHAR2, T2 IN VARCHAR2) AS 
    v_r1 number; 
    v_r2 number; 
    v_sql1 varchar2(200); 
    v_sql2 varchar2(200); 
BEGIN 
    v_sql1 := 'select count(1) from ' || T1; 
    v_sql2 := 'select count(1) from ' || T2; 
    EXECUTE IMMEDIATE v_sql1 into v_r1; 
    EXECUTE IMMEDIATE v_sql2 into v_r2; 
    dbms_output.put_line(T1 || ' count = ' || v_r1 || ', ' || T2 || ' count = ' || v_r2); 
END; 
+0

실수를 없애기 위해 예제를 변경했습니다. 감사! –

+0

@all : 회신 해 주셔서 감사합니다. 도움이되었습니다.이 두 테이블의 불화를 어떻게 비교할 수 있는지 알려주십시오. – user223541