存储过程,用多个条件从多个表中的多个列中获取数据

时间:2017-10-18 00:50:08

标签: sql oracle stored-procedures

我在寻找什么?

创建存储过程以将结果写入表中,或者最坏的情况是简化此查询。

查询

SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
bp.ORIGINAL_REGISTERED_ID,
bap.ANOTHER_COLUMN_1,
bap.ANOTHER_COLUMN_2,
bap.ANOTHER_COLUMN_3,
bap.ANOTHER_COLUMN_4,
bd.ANOTHER_COLUMN_1,
bd.REGISTERED_ID
FROM BANK_ACCOUNT_PARTNER bap,
BANK_PARTNER bp,
BANK_ACCOUNT ba,
BANKING_DATA bd
WHERE bap.PARTNER_ID=bp.PARTNER_ID
AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
AND ba.REGISTERED_ID=bd.REGISTERED_ID
AND bap.ACCOUNT_ID IN
    (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
    ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
    FROM BANK_ACCOUNT ba,
    BANKING_DATA bd,
    ANOTHER_TABLE at
    WHERE da.REGISTERED_ID = bd.REGISTERED_ID
    AND at.REGISTERED_ID=bd.REGISTERED_ID
    AND ANOTHER_CRITERIA_COLUMN = 'someValue'
    AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
    AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
    AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以使用CURSOR或简单SELECT INTO检索查询结果,以便进行标量查询,如下所示:

CREATE PROCEDURE myProcedure IS
        BANK_ACCOUNT_NUMBER VARCHAR(30);
        ORIGINAL_REGISTERED_ID BANK_PARTNER.ORIGINAL_REGISTERED_ID%TYPE;
        ANOTHER_COLUMN_BAP1 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_1%TYPE;
        ANOTHER_COLUMN_2 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_2%TYPE;
        ANOTHER_COLUMN_3 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_3%TYPE;
        ANOTHER_COLUMN_4 BANK_ACCOUNT_PARTNER.ANOTHER_COLUMN_4%TYPE;
        ANOTHER_COLUMN_BD1 BANKING_DATA.ANOTHER_COLUMN_1%TYPE;
        REGISTERED_ID BANKING_DATA.REGISTERED_ID%TYPE;
BEGIN
    SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
    bp.ORIGINAL_REGISTERED_ID,
    bap.ANOTHER_COLUMN_1,
    bap.ANOTHER_COLUMN_2,
    bap.ANOTHER_COLUMN_3,
    bap.ANOTHER_COLUMN_4,
    bd.ANOTHER_COLUMN_1,
    bd.REGISTERED_ID INTO BANK_ACCOUNT_NUMBER, ORIGINAL_REGISTERED_ID, ANOTHER_COLUMN_BAP1, ANOTHER_COLUMN_2, ANOTHER_COLUMN_3, ANOTHER_COLUMN_4,  ANOTHER_COLUMN_BD1, REGISTERED_ID
    FROM BANK_ACCOUNT_PARTNER bap,
    BANK_PARTNER bp,
    BANK_ACCOUNT ba,
    BANKING_DATA bd
    WHERE bap.PARTNER_ID=bp.PARTNER_ID
    AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
    AND ba.REGISTERED_ID=bd.REGISTERED_ID
    AND bap.ACCOUNT_ID IN
        (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
        ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
        FROM BANK_ACCOUNT ba,
        BANKING_DATA bd,
        ANOTHER_TABLE at
        WHERE da.REGISTERED_ID = bd.REGISTERED_ID
        AND at.REGISTERED_ID=bd.REGISTERED_ID
        AND ANOTHER_CRITERIA_COLUMN = 'someValue'
        AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
        AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
        AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');

    INSERT INTO myTable VALUES(BANK_ACCOUNT_NUMBER, ORIGINAL_REGISTERED_ID, ANOTHER_COLUMN_BAP1, ANOTHER_COLUMN_2, ANOTHER_COLUMN_3, ANOTHER_COLUMN_4,  ANOTHER_COLUMN_BD1, REGISTERED_ID);
END;
/

或使用CURSOR循环:

CREATE PROCEDURE myProcedure IS
    CURSOR query IS 
        SELECT CONCAT(ba.BRANCH_NUMBER,ba.CLIENT_ID) AS BANK_ACCOUNT_NUMBER,
        bp.ORIGINAL_REGISTERED_ID,
        bap.ANOTHER_COLUMN_1 AS ANOTHER_COLUMN_BAP1,
        bap.ANOTHER_COLUMN_2,
        bap.ANOTHER_COLUMN_3,
        bap.ANOTHER_COLUMN_4,
        bd.ANOTHER_COLUMN_1 AS ANOTHER_COLUMN_BD1,
        bd.REGISTERED_ID
        FROM BANK_ACCOUNT_PARTNER bap,
        BANK_PARTNER bp,
        BANK_ACCOUNT ba,
        BANKING_DATA bd
        WHERE bap.PARTNER_ID=bp.PARTNER_ID
        AND bap.ACCOUNT_ID=ba.ACCOUNT_ID
        AND ba.REGISTERED_ID=bd.REGISTERED_ID
        AND bap.ACCOUNT_ID IN
            (SELECT ACCOUNT_ID FROM(SELECT ba.ACCOUNT_ID,
            ROW_NUMBER() OVER (PARTITION BY ba.BRANCH_NUMBER, ba.CLIENT_ID ORDER BY bd.ACCOUNT_OPENED_DATE DESC) ROW_NUMBER
            FROM BANK_ACCOUNT ba,
            BANKING_DATA bd,
            ANOTHER_TABLE at
            WHERE da.REGISTERED_ID = bd.REGISTERED_ID
            AND at.REGISTERED_ID=bd.REGISTERED_ID
            AND ANOTHER_CRITERIA_COLUMN = 'someValue'
            AND ANOTHER_CRITERIA_COLUMN IN ('someValue1','someValue2','someValue3')
            AND ba.ANOTHER_CRITERIA_COLUMN='someValue'
            AND ba.ACCOUNT_MATURITY_DATE IS NULL) WHERE ROW_NUMBER='1');
BEGIN
     FOR line IN query LOOP
        INSERT INTO myTable VALUES(line.BANK_ACCOUNT_NUMBER, line.ORIGINAL_REGISTERED_ID, line.ANOTHER_COLUMN_BAP1, line.ANOTHER_COLUMN_2, line.ANOTHER_COLUMN_3, line.ANOTHER_COLUMN_4,  line.ANOTHER_COLUMN_BD1, line.REGISTERED_ID);
     END LOOP;
END;
/