PL / SQL在表

时间:2016-10-07 13:36:29

标签: sql oracle

我有一个表asg_tab和grad_tab,例如:

asg_tab

person_id  grade_id   full_name  start date      end date
1                           smith     01-Jan-2016    20-Feb-2016
1                001        smith     21-Feb-2016    31-Dec-4712
2                           will      01-Feb-2016    18-Mar-2016
2                004        will      19-Mar-2016    31-Dec-4712

grd_tab

grade_id  grade name
001       Band 1 
002       Band 2 
004       Band 3 

现在在asg标签中,如果grade_id有任何变化,我必须创建一个将返回start_date和grade_name的查询/函数

我为此创建了以下查询:

SELECT  *
From    (
        Select  Person_id,
   Grade_Id,
                LAG(grade_id) OVER (PARTITION BY person_ID ORDER BY start_Date) AS prev_grade_line1,
                Row_Number() Over (Partition By Person_Id Order By Start_Date Desc) As Rn,
                Effective_Start_Date
                        From    asg_tab

        )
WHERE   rn = 1;

但是,当所有开始日期的人员ID为空时,这也会返回等级

2 个答案:

答案 0 :(得分:0)

也许这可以让您了解如何为您的问题制作功能。

CREATE OR REPLACE FUNCTION WaterIsNotBlue (nId IN VARCHAR2, nColumnA IN VARCHAR2)
RETURN VARCHAR2
AS
    CURSOR cTableA IS
        SELECT * FROM TableA WHERE Id = nId;

    rTableA cTableA%ROWTYPE;
BEGIN
    -- Fetch current values of row. 
    OPEN cTableA;
    FETCH cTableA INTO rTableA;
    CLOSE cTableA;

    INSERT INTO TableA(Id, ColumnA)
    VALUES(nId, nColumnA);

    COMMIT;

    -- Check if anything changed. 
    IF rTableA.ColumnA != nColumnA THEN
        RETURN 'A';
    ELSE
        RETURN 'B';
    END IF;
END;
/

答案 1 :(得分:0)

您似乎需要一个触发器来检测更改..但是通过触发器,您只能将所需信息(effective_Start日期和名称)插入到新表中。