表没有一个整数作为主键如何对它执行操作?

时间:2013-07-10 05:27:53

标签: plsql

这个问题是在我大学的一次实际考试中提出的。 问:表格包含以下列头/列:

medicine_name,medicine_manufacture_date,medicine_expiry_date.

正如柱头名称所描述的那样,他们拥有关于药物的相应数据。 现在,他们要求编写一个pl / sql块来列出已过期的所有药物名称(即当前系统日期大于药物的初始值)。 我强烈认为必须将连续的连续整数列(如1,2,3,... n)添加到表中,这将作为每个药物名称的主键。医学名称是唯一的,但要执行迭代操作他们应该拥有一个整数主键。 是否仍然可以在不指定ineteger主键的情况下获得结果?

我更改了表并为每条记录分配了主键并编写了以下块...它有效 但我想在不指定主键的情况下这样做。所有可能的智能方式都会受到尊重!Plz建议修改我的代码中的任何类型...我的代码如下:

   declare
         a date;
         b date;
        diff number(10);
        medicine varchar(25);
   begin
              a:=sysdate;
                        for i in 1..5
               loop
                       select medicine_expiry_date into b from med_details where med_id=i ;
                            diff:=trunc(a-b);
                  if
                       diff>0  then
                            select medicine_name into medicine from med_details where med_id=i;
                                dbms_output.put_line(medicine);
                          end if;
             end loop;
  end;
  /

2 个答案:

答案 0 :(得分:1)

尝试

BEGIN
  DBMS_OUTPUT.PUT_LINE('The following medicines have expired:');

  FOR aRow IN (SELECT MEDICINE_NAME
                 FROM MEDICINE
                 WHERE EXPIRY_DATE < SYSDATE)
  LOOP
    DBMS_OUTPUT.PUT_LINE(aRow.MEDICINE_NAME);
  END LOOP;
END;

如果需要有一些其他表参考此表并且没有其他实用候选键可用,您可以在此表上放置一个人工主键,但不需要回答上面提到的问题。

分享并享受。

答案 1 :(得分:0)

看起来很简单......我怀疑还有一些额外的细节。

/*
Q: A table has following columnheads/columns: 
medicine_name,
medicine_manufacture_date,
medicine_expiry_date.

Now they asked to write a pl/sql block to make list of all medicines' names which have expired
(i.e.current system date is greater than the expirydate values of the medicine).
*/

-- SQL:

SELECT medicine_name
FROM a_table
WHERE medicine_expiry_date < SYSDATE;

-- PL/SQL v.1:

DECLARE
    TYPE medicine_ntt IS TABLE OF a_table%ROWTYPE;
    l_medicine  medicine_ntt;
BEGIN
    SELECT  medicine_name
    ,       medicine_expiry_date
    BULK    COLLECT INTO l_medicine
    FROM    a_table;

    FOR indx IN 1..l_medicine.COUNT LOOP
        IF l_medicine(indx).medicine_expiry_date < SYSDATE THEN
            DBMS_OUTPUT.PUT_LINE(l_medicine(indx).medicine_name);
        END IF;
    END LOOP;
END;

-- PL/SQL v.2:

DECLARE
    CURSOR medicine_cur IS
        SELECT  medicine_name
        ,       medicine_expiry_date
        FROM    a_table;

    TYPE medicine_ntt IS TABLE OF medicine_cur%ROWTYPE;
    l_medicine         medicine_ntt;
    l_medicine_expired medicine_ntt := medicine_ntt();
BEGIN
    OPEN  medicine_cur;
    FETCH medicine_cur BULK COLLECT INTO l_medicine;
    CLOSE medicine_cur;

    FOR indx IN 1..l_medicine.COUNT LOOP
        IF l_medicine(indx).medicine_expiry_date < SYSDATE THEN
            l_medicine_expired.EXTEND;
            l_medicine_expired(l_medicine_expired.LAST) := l_medicine(indx);
        END IF;
    END LOOP;

    FOR indx IN 1..l_medicine_expired.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE(l_medicine_expired(indx).medicine_name);
    END LOOP;
END;