Plsql 表没有作为主键的ineteger如何对其执行操作?

Plsql 表没有作为主键的ineteger如何对其执行操作?,plsql,Plsql,这个问题是在我大学的一次实践考试中提出的。 问:表格有以下列头/列: medicine_name,medicine_manufacture_date,medicine_expiry_date. 正如列标题名称所描述的那样,其中包含了有关药物的相应数据。 现在,他们要求编写一个pl/sql块来列出所有过期药物的名称,即当前系统日期大于药物的过期日期值。 我强烈认为必须在表中添加连续整数(如1,2,3,…n)列,该列将作为每个药品名称的主键。药品名称是唯一的,但要执行迭代操作,它们应该拥有一个整数

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

medicine_name,medicine_manufacture_date,medicine_expiry_date.
正如列标题名称所描述的那样,其中包含了有关药物的相应数据。 现在,他们要求编写一个pl/sql块来列出所有过期药物的名称,即当前系统日期大于药物的过期日期值。 我强烈认为必须在表中添加连续整数(如1,2,3,…n)列,该列将作为每个药品名称的主键。药品名称是唯一的,但要执行迭代操作,它们应该拥有一个整数主键。 是否仍然可以在不分配ineteger主键的情况下获得结果

我改变了表格,给每条记录分配了主键,并写了下面的代码块。。。它起作用了 但是我想在不分配主键的情况下完成它。所有可能的聪明方式都会被崇拜!请建议更正我代码中的任何类型。。。我的代码如下:

   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;
  /

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

/*
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;
试一试

如果需要其他表引用此表,并且没有其他实用的候选键可用,则可以在此表上放置一个人工主键,但不需要回答上述问题


共享和享受。

不需要整数主键。你认为为什么需要它?太好了,它工作得太好了!我不知所措!你从哪里学的书请给它起个名字…谢谢!我通过多年的编程学习了PL/SQL。就书籍而言,我喜欢和喜欢。分享和享受。再次感谢亲爱的鲍勃,我希望我能有一个像你这样的大师!我刚刚编辑了我的问题并添加了我的代码,如果你建议我改进的话,我会很高兴的。。我一周前就开始学习pl/sql了。谢谢你的回复!你能用更压缩的方式来做吗@Deepeshkumar看一下PL/SQLV.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;